@hypurrquant/defi-cli 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/config/chains.toml +54 -0
  2. package/config/protocols/dex/aerodrome_base.toml +15 -0
  3. package/config/protocols/dex/aerodrome_cl.toml +17 -0
  4. package/config/protocols/dex/apeswap_bnb.toml +14 -0
  5. package/config/protocols/dex/babydogeswap_bnb.toml +14 -0
  6. package/config/protocols/dex/bakeryswap_bnb.toml +14 -0
  7. package/config/protocols/dex/biswap_bnb.toml +14 -0
  8. package/config/protocols/dex/bscswap_bnb.toml +14 -0
  9. package/config/protocols/dex/curve_hyperevm.toml +21 -0
  10. package/config/protocols/dex/fstswap_bnb.toml +14 -0
  11. package/config/protocols/dex/hybra.toml +3 -1
  12. package/config/protocols/dex/hyperswap.toml +15 -0
  13. package/config/protocols/dex/kittenswap.toml +4 -1
  14. package/config/protocols/dex/merchantmoe_mantle.toml +1 -0
  15. package/config/protocols/dex/nest.toml +3 -1
  16. package/config/protocols/dex/pancakeswap_v2_bnb.toml +14 -0
  17. package/config/protocols/dex/pancakeswap_v3_bnb.toml +15 -0
  18. package/config/protocols/dex/project_x.toml +4 -2
  19. package/config/protocols/dex/ramses_cl.toml +14 -7
  20. package/config/protocols/dex/ramses_hl.toml +6 -14
  21. package/config/protocols/dex/thena_fusion_bnb.toml +14 -0
  22. package/config/protocols/dex/thena_v1_bnb.toml +13 -0
  23. package/config/protocols/dex/traderjoe_monad.toml +14 -0
  24. package/config/protocols/dex/uniswap_v2_monad.toml +12 -0
  25. package/config/protocols/dex/uniswap_v3_base.toml +14 -0
  26. package/config/protocols/dex/uniswap_v3_bnb.toml +13 -0
  27. package/config/protocols/dex/uniswap_v3_monad.toml +14 -0
  28. package/config/protocols/lending/.omc/state/last-tool-error.json +7 -0
  29. package/config/protocols/lending/aave_v3_base.toml +14 -0
  30. package/config/protocols/lending/aave_v3_bnb.toml +14 -0
  31. package/config/protocols/lending/compound_v3_base.toml +14 -0
  32. package/config/protocols/lending/felix_morpho.toml +2 -1
  33. package/config/protocols/lending/hyperlend.toml +2 -1
  34. package/config/protocols/lending/hypurrfi.toml +2 -1
  35. package/config/protocols/lending/kinza_bnb.toml +15 -0
  36. package/config/protocols/lending/morpho_blue_monad.toml +11 -0
  37. package/config/protocols/lending/venus_bnb.toml +18 -0
  38. package/config/protocols/lending/venus_flux_bnb.toml +22 -0
  39. package/config/protocols/vault/beefy_bnb.toml +12 -0
  40. package/config/tokens/arbitrum.toml +77 -0
  41. package/config/tokens/base.toml +50 -0
  42. package/config/tokens/bnb.toml +50 -0
  43. package/config/tokens/ethereum.toml +107 -0
  44. package/config/tokens/hyperevm.toml +1 -0
  45. package/config/tokens/monad.toml +48 -0
  46. package/dist/index.js +171 -68
  47. package/dist/index.js.map +1 -1
  48. package/dist/main.js +231 -136
  49. package/dist/main.js.map +1 -1
  50. package/dist/mcp-server.js +59 -4
  51. package/dist/mcp-server.js.map +1 -1
  52. package/package.json +3 -1
  53. package/skills/defi-cli/package.json +1 -1
  54. package/config/pools.example.toml +0 -31
  55. package/config/protocols/cdp/felix.toml +0 -21
  56. package/config/protocols/nft/seaport_hyperevm.toml +0 -10
  57. package/config/protocols/vault/felix_vaults.toml +0 -21
  58. package/config/protocols/vault/hyperbeat_hyperevm.toml +0 -29
  59. package/config/protocols/vault/hypersurface_hyperevm.toml +0 -13
  60. package/config/protocols/vault/looping_hyperevm.toml +0 -17
  61. package/config/protocols/vault/upshift.toml +0 -14
  62. package/config/protocols/yield_aggregator/lazy_summer.toml +0 -13
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../defi-core/src/types.ts","../../defi-core/src/error.ts","../../defi-core/src/json.ts","../../defi-core/src/erc20.ts","../../defi-core/src/provider.ts","../../defi-core/src/multicall.ts","../../defi-core/src/registry/chain.ts","../../defi-core/src/registry/protocol.ts","../../defi-core/src/registry/registry.ts","../../defi-protocols/src/factory.ts","../../defi-protocols/src/dex/uniswap_v3.ts","../../defi-protocols/src/dex/uniswap_v2.ts","../../defi-protocols/src/dex/algebra_v3.ts","../../defi-protocols/src/dex/tick_math.ts","../../defi-protocols/src/dex/balancer_v3.ts","../../defi-protocols/src/dex/curve.ts","../../defi-protocols/src/dex/solidly.ts","../../defi-protocols/src/dex/thena_cl.ts","../../defi-protocols/src/dex/hybra_gauge.ts","../../defi-protocols/src/dex/woofi.ts","../../defi-protocols/src/dex/solidly_gauge.ts","../../defi-protocols/src/dex/masterchef.ts","../../defi-protocols/src/dex/merchant_moe_lb.ts","../../defi-protocols/src/dex/kittenswap_farming.ts","../../defi-protocols/src/dex/nest_offchain.ts","../../defi-protocols/src/lending/aave_v3.ts","../../defi-protocols/src/lending/aave_v2.ts","../../defi-protocols/src/lending/aave_oracle.ts","../../defi-protocols/src/lending/compound_v2.ts","../../defi-protocols/src/lending/compound_v3.ts","../../defi-protocols/src/lending/euler_v2.ts","../../defi-protocols/src/lending/morpho.ts","../../defi-protocols/src/cdp/felix.ts","../../defi-protocols/src/cdp/felix_oracle.ts","../../defi-protocols/src/vault/erc4626.ts","../../defi-protocols/src/liquid_staking/generic_lst.ts","../../defi-protocols/src/liquid_staking/sthype.ts","../../defi-protocols/src/liquid_staking/kinetiq.ts","../../defi-protocols/src/yield_source/pendle.ts","../../defi-protocols/src/yield_source/generic_yield.ts","../../defi-protocols/src/derivatives/hlp.ts","../../defi-protocols/src/derivatives/generic_derivatives.ts","../../defi-protocols/src/options/rysk.ts","../../defi-protocols/src/options/generic_options.ts","../../defi-protocols/src/nft/erc721.ts","../../defi-protocols/src/dex/dex_price.ts","../src/cli.ts","../src/executor.ts","../src/output.ts","../src/table.ts","../src/commands/status.ts","../src/agent.ts","../src/commands/schema.ts","../src/commands/lp.ts","../src/whitelist.ts","../src/signer/resolve.ts","../src/signer/ows-loader.ts","../src/signer/ows-evm.ts","../src/commands/lending.ts","../src/utils.ts","../src/commands/yield.ts","../src/commands/portfolio.ts","../src/portfolio-tracker.ts","../src/commands/price.ts","../src/commands/wallet.ts","../src/commands/token.ts","../src/commands/bridge.ts","../src/commands/swap.ts","../src/commands/setup.ts","../src/commands/ows.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\n\n// === Transaction Types ===\n\n/** A built DeFi transaction ready for simulation or broadcast */\nexport interface DeFiTx {\n description: string;\n to: Address;\n data: Hex;\n value: bigint;\n gas_estimate?: number;\n /** ERC20 approvals to check and send before broadcasting this tx */\n approvals?: Array<{\n token: Address;\n spender: Address;\n amount: bigint;\n }>;\n /** Pre-transactions to execute before the main tx (e.g. farming approval) */\n pre_txs?: DeFiTx[];\n}\n\n/** Result of executing or simulating a transaction */\nexport interface ActionResult {\n tx_hash?: string;\n status: TxStatus;\n gas_used?: number;\n description: string;\n details: Record<string, unknown>;\n}\n\n/** Transaction status (serde: snake_case) */\nexport enum TxStatus {\n DryRun = \"dry_run\",\n Simulated = \"simulated\",\n SimulationFailed = \"simulation_failed\",\n NeedsApproval = \"needs_approval\",\n Pending = \"pending\",\n Confirmed = \"confirmed\",\n Failed = \"failed\",\n}\n\n// === Token Types ===\n\n/** Token amount with decimals-aware formatting */\nexport interface TokenAmount {\n token: Address;\n symbol: string;\n amount: bigint;\n decimals: number;\n}\n\nexport function formatHuman(t: TokenAmount): string {\n const divisor = 10n ** BigInt(t.decimals);\n const whole = t.amount / divisor;\n const frac = t.amount % divisor;\n return `${whole}.${frac.toString().padStart(t.decimals, \"0\")} ${t.symbol}`;\n}\n\n/** Slippage tolerance in basis points */\nexport interface Slippage {\n bps: number;\n}\n\nexport function newSlippage(bps: number): Slippage {\n return { bps };\n}\n\nexport function defaultSwapSlippage(): Slippage {\n return { bps: 50 };\n}\n\nexport function applyMinSlippage(slippage: Slippage, amount: bigint): bigint {\n return (amount * BigInt(10000 - slippage.bps)) / 10000n;\n}\n\n// === Oracle / Price Types ===\n\nexport interface PriceData {\n source: string;\n source_type: string;\n asset: Address;\n price_usd: bigint;\n price_f64: number;\n block_number?: number;\n timestamp?: number;\n}\n\n// === DEX Types ===\n\nexport interface SwapParams {\n protocol: string;\n token_in: Address;\n token_out: Address;\n amount_in: bigint;\n slippage: Slippage;\n recipient: Address;\n deadline?: number;\n}\n\nexport interface QuoteParams {\n protocol: string;\n token_in: Address;\n token_out: Address;\n amount_in: bigint;\n}\n\nexport interface QuoteResult {\n protocol: string;\n amount_out: bigint;\n price_impact_bps?: number;\n fee_bps?: number;\n route: string[];\n}\n\nexport interface AddLiquidityParams {\n protocol: string;\n token_a: Address;\n token_b: Address;\n amount_a: bigint;\n amount_b: bigint;\n recipient: Address;\n /** Optional lower tick for concentrated LP (defaults to full range) */\n tick_lower?: number;\n /** Optional upper tick for concentrated LP (defaults to full range) */\n tick_upper?: number;\n /** ±N% concentrated range around current price (e.g. 2 for ±2%) */\n range_pct?: number;\n /** Optional pool address for tick detection / single-side LP */\n pool?: Address;\n}\n\nexport interface RemoveLiquidityParams {\n protocol: string;\n token_a: Address;\n token_b: Address;\n liquidity: bigint;\n recipient: Address;\n /** NFT tokenId for V3 / CL position managers (required for V3-style removes) */\n token_id?: bigint;\n}\n\n// === Lending Types ===\n\nexport interface SupplyParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n on_behalf_of: Address;\n}\n\nexport interface BorrowParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n interest_rate_mode: InterestRateMode;\n on_behalf_of: Address;\n}\n\n/** Interest rate mode (serde: snake_case) */\nexport enum InterestRateMode {\n Variable = \"variable\",\n Stable = \"stable\",\n}\n\nexport interface RepayParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n interest_rate_mode: InterestRateMode;\n on_behalf_of: Address;\n}\n\nexport interface WithdrawParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n to: Address;\n}\n\nexport interface LendingRates {\n protocol: string;\n asset: Address;\n supply_apy: number;\n borrow_variable_apy: number;\n borrow_stable_apy?: number;\n utilization: number;\n total_supply: bigint;\n total_borrow: bigint;\n /** Reward token addresses for supply-side incentives */\n supply_reward_tokens?: string[];\n /** Reward token addresses for borrow-side incentives */\n borrow_reward_tokens?: string[];\n /** Emissions per second per supply reward token (raw uint256 as string) */\n supply_emissions_per_second?: string[];\n /** Emissions per second per borrow reward token (raw uint256 as string) */\n borrow_emissions_per_second?: string[];\n /** Supply-side incentive APY (%) from reward token emissions */\n supply_incentive_apy?: number;\n /** Borrow-side incentive APY (%) from reward token emissions (negative = subsidized) */\n borrow_incentive_apy?: number;\n}\n\nexport interface UserPosition {\n protocol: string;\n user: Address;\n supplies: PositionAsset[];\n borrows: PositionAsset[];\n health_factor?: number;\n net_apy?: number;\n}\n\nexport interface PositionAsset {\n asset: Address;\n symbol: string;\n amount: bigint;\n value_usd?: number;\n}\n\n// === CDP Types ===\n\nexport interface OpenCdpParams {\n protocol: string;\n collateral: Address;\n collateral_amount: bigint;\n debt_amount: bigint;\n recipient: Address;\n}\n\nexport interface AdjustCdpParams {\n protocol: string;\n cdp_id: bigint;\n collateral_delta?: bigint;\n debt_delta?: bigint;\n add_collateral: boolean;\n add_debt: boolean;\n}\n\nexport interface CloseCdpParams {\n protocol: string;\n cdp_id: bigint;\n}\n\nexport interface CdpInfo {\n protocol: string;\n cdp_id: bigint;\n collateral: TokenAmount;\n debt: TokenAmount;\n collateral_ratio: number;\n liquidation_price?: number;\n}\n\n// === Liquid Staking Types ===\n\nexport interface StakeParams {\n protocol: string;\n amount: bigint;\n recipient: Address;\n}\n\nexport interface UnstakeParams {\n protocol: string;\n amount: bigint;\n recipient: Address;\n}\n\nexport interface StakingInfo {\n protocol: string;\n staked_token: Address;\n liquid_token: Address;\n exchange_rate: number;\n apy?: number;\n total_staked: bigint;\n}\n\n// === Vault Types (ERC-4626) ===\n\nexport interface VaultInfo {\n protocol: string;\n vault_address: Address;\n asset: Address;\n total_assets: bigint;\n total_supply: bigint;\n apy?: number;\n}\n\n// === Derivatives Types ===\n\nexport interface DerivativesPositionParams {\n protocol: string;\n market: string;\n size: bigint;\n collateral: bigint;\n is_long: boolean;\n}\n\n// === Options Types ===\n\nexport interface OptionParams {\n protocol: string;\n underlying: Address;\n strike_price: bigint;\n expiry: number;\n is_call: boolean;\n amount: bigint;\n}\n\n// === ve(3,3) Types ===\n\n/** A pool that has an active emission gauge */\nexport interface GaugedPool {\n pool: Address;\n gauge: Address;\n token0: string; // symbol\n token1: string; // symbol\n token0Addr?: Address;\n token1Addr?: Address;\n type: \"V2\" | \"CL\";\n tickSpacing?: number; // for CL pools\n stable?: boolean; // for V2 pools\n /** Reward rate in wei per second (from gauge.rewardRate or rewardData) */\n rewardRate?: bigint;\n /** Total LP staked in gauge (wei) */\n totalStaked?: bigint;\n /** Reward token address */\n rewardToken?: Address;\n /** Calculated emission APR (%) — set by caller if prices available */\n aprPercent?: number;\n /** Pool TVL in USD — set by caller if prices available */\n poolTvlUsd?: number;\n}\n\nexport interface RewardInfo {\n token: Address;\n symbol: string;\n amount: bigint;\n value_usd?: number;\n}\n\nexport interface GaugeInfo {\n gauge: Address;\n pool: Address;\n total_staked: bigint;\n reward_rate: bigint;\n rewards: RewardInfo[];\n}\n\nexport interface VeNftInfo {\n token_id: bigint;\n amount: bigint;\n unlock_time: number;\n voting_power: bigint;\n}\n\n// === Yield Types ===\n\nexport interface YieldInfo {\n protocol: string;\n pool: string;\n apy: number;\n tvl: bigint;\n tokens: Address[];\n}\n\n// === Portfolio Tracker Types ===\nexport interface PortfolioSnapshot {\n timestamp: number;\n chain: string;\n wallet: string;\n tokens: TokenBalance[];\n defi_positions: DefiPosition[];\n total_value_usd: number;\n}\n\nexport interface TokenBalance {\n token: string;\n symbol: string;\n balance: bigint;\n value_usd: number;\n price_usd: number;\n}\n\nexport interface DefiPosition {\n protocol: string;\n type: \"lending_supply\" | \"lending_borrow\" | \"lp\" | \"staking\" | \"vault\";\n asset: string;\n amount: bigint;\n value_usd: number;\n}\n\nexport interface PortfolioPnL {\n period: string;\n start_value_usd: number;\n end_value_usd: number;\n pnl_usd: number;\n pnl_pct: number;\n token_changes: TokenChange[];\n}\n\nexport interface TokenChange {\n symbol: string;\n balance_change: bigint;\n value_change_usd: number;\n}\n","import type { Address } from \"viem\";\n\nexport type DefiErrorCode =\n | \"PROTOCOL_NOT_FOUND\"\n | \"TOKEN_NOT_FOUND\"\n | \"CHAIN_NOT_FOUND\"\n | \"INSUFFICIENT_BALANCE\"\n | \"INSUFFICIENT_ALLOWANCE\"\n | \"SLIPPAGE_EXCEEDED\"\n | \"SIMULATION_FAILED\"\n | \"ABI_ERROR\"\n | \"REGISTRY_ERROR\"\n | \"RPC_ERROR\"\n | \"PROVIDER_ERROR\"\n | \"CONTRACT_ERROR\"\n | \"INVALID_PARAM\"\n | \"UNSUPPORTED\"\n | \"TX_FAILED\"\n | \"INTERNAL\";\n\nexport class DefiError extends Error {\n readonly code: DefiErrorCode;\n\n constructor(code: DefiErrorCode, message: string) {\n super(message);\n this.name = \"DefiError\";\n this.code = code;\n }\n\n static protocolNotFound(name: string): DefiError {\n return new DefiError(\"PROTOCOL_NOT_FOUND\", `Protocol not found: ${name}`);\n }\n\n static tokenNotFound(name: string): DefiError {\n return new DefiError(\"TOKEN_NOT_FOUND\", `Token not found: ${name}`);\n }\n\n static chainNotFound(name: string): DefiError {\n return new DefiError(\"CHAIN_NOT_FOUND\", `Chain not found: ${name}`);\n }\n\n static insufficientBalance(needed: string, available: string): DefiError {\n return new DefiError(\n \"INSUFFICIENT_BALANCE\",\n `Insufficient balance: need ${needed}, have ${available}`,\n );\n }\n\n static insufficientAllowance(spender: Address): DefiError {\n return new DefiError(\n \"INSUFFICIENT_ALLOWANCE\",\n `Insufficient allowance for spender ${spender}`,\n );\n }\n\n static slippageExceeded(expected: string, actual: string): DefiError {\n return new DefiError(\n \"SLIPPAGE_EXCEEDED\",\n `Slippage exceeded: expected ${expected}, got ${actual}`,\n );\n }\n\n static simulationFailed(reason: string): DefiError {\n return new DefiError(\n \"SIMULATION_FAILED\",\n `Transaction simulation failed: ${reason}`,\n );\n }\n\n static abiError(reason: string): DefiError {\n return new DefiError(\"ABI_ERROR\", `ABI encoding error: ${reason}`);\n }\n\n static registryError(reason: string): DefiError {\n return new DefiError(\"REGISTRY_ERROR\", `Registry error: ${reason}`);\n }\n\n static rpcError(reason: string): DefiError {\n return new DefiError(\"RPC_ERROR\", `RPC error: ${reason}`);\n }\n\n static providerError(reason: string): DefiError {\n return new DefiError(\"PROVIDER_ERROR\", `Provider error: ${reason}`);\n }\n\n static contractError(reason: string): DefiError {\n return new DefiError(\"CONTRACT_ERROR\", `Contract error: ${reason}`);\n }\n\n static invalidParam(reason: string): DefiError {\n return new DefiError(\"INVALID_PARAM\", `Invalid parameter: ${reason}`);\n }\n\n static unsupported(operation: string): DefiError {\n return new DefiError(\n \"UNSUPPORTED\",\n `Unsupported operation: ${operation}`,\n );\n }\n\n static internal(reason: string): DefiError {\n return new DefiError(\"INTERNAL\", `Internal error: ${reason}`);\n }\n\n toJSON() {\n return { error: this.message };\n }\n}\n\nexport type Result<T> = T;\n","/**\n * BigInt JSON serialization utilities.\n *\n * Rust's alloy U256 (backed by ruint) serializes to JSON as 0x-prefixed\n * lowercase hex strings (e.g., \"0x75bcd15\"). We must match this exactly\n * for behavioral parity.\n */\n\n/** JSON replacer for Rust parity — bigint becomes 0x-hex string */\nexport function jsonReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return \"0x\" + value.toString(16);\n }\n return value;\n}\n\n/** JSON replacer for SDK consumers — bigint becomes decimal string */\nexport function jsonReplacerDecimal(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n\n/** Stringify with decimal bigint handling */\nexport function jsonStringify(data: unknown, pretty = true): string {\n return pretty\n ? JSON.stringify(data, jsonReplacerDecimal, 2)\n : JSON.stringify(data, jsonReplacerDecimal);\n}\n\n/** Parse a 0x-hex or decimal string to bigint */\nexport function parseBigInt(value: string): bigint {\n if (value.startsWith(\"0x\") || value.startsWith(\"0X\")) {\n return BigInt(value);\n }\n return BigInt(value);\n}\n","import type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseAbi } from \"viem\";\nimport type { DeFiTx } from \"./types.js\";\n\nconst erc20Abi = parseAbi([\n \"function name() view returns (string)\",\n \"function symbol() view returns (string)\",\n \"function decimals() view returns (uint8)\",\n \"function totalSupply() view returns (uint256)\",\n \"function balanceOf(address account) view returns (uint256)\",\n \"function transfer(address to, uint256 amount) returns (bool)\",\n \"function allowance(address owner, address spender) view returns (uint256)\",\n \"function approve(address spender, uint256 amount) returns (bool)\",\n \"function transferFrom(address from, address to, uint256 amount) returns (bool)\",\n]);\n\nexport { erc20Abi };\n\nexport function buildApprove(\n token: Address,\n spender: Address,\n amount: bigint,\n): DeFiTx {\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n });\n return {\n description: `Approve ${spender} to spend ${amount} of token ${token}`,\n to: token,\n data,\n value: 0n,\n gas_estimate: 60_000,\n };\n}\n\nexport function buildTransfer(\n token: Address,\n to: Address,\n amount: bigint,\n): DeFiTx {\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, amount],\n });\n return {\n description: `Transfer ${amount} of token ${token} to ${to}`,\n to: token,\n data,\n value: 0n,\n gas_estimate: 65_000,\n };\n}\n","import { createPublicClient, http, type PublicClient } from \"viem\";\n\nconst providerCache = new Map<string, PublicClient>();\n\nexport function getProvider(rpcUrl: string): PublicClient {\n const cached = providerCache.get(rpcUrl);\n if (cached) return cached;\n\n const client = createPublicClient({ transport: http(rpcUrl) });\n providerCache.set(rpcUrl, client);\n return client;\n}\n\nexport function clearProviderCache(): void {\n providerCache.clear();\n}\n","import type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, decodeFunctionResult, parseAbi } from \"viem\";\nimport type { DeFiTx } from \"./types.js\";\nimport { getProvider } from \"./provider.js\";\n\nexport const MULTICALL3_ADDRESS: Address =\n \"0xcA11bde05977b3631167028862bE2a173976CA11\";\n\nconst multicall3Abi = parseAbi([\n \"struct Call3 { address target; bool allowFailure; bytes callData; }\",\n \"struct Result { bool success; bytes returnData; }\",\n \"function aggregate3(Call3[] calls) returns (Result[] returnData)\",\n]);\n\nexport function buildMulticall(calls: Array<[Address, Hex]>): DeFiTx {\n const mcCalls = calls.map(([target, callData]) => ({\n target,\n allowFailure: true,\n callData,\n }));\n\n const data = encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [mcCalls],\n });\n\n return {\n description: `Multicall3 batch (${calls.length} calls)`,\n to: MULTICALL3_ADDRESS,\n data,\n value: 0n,\n };\n}\n\nexport async function multicallRead(\n rpcUrl: string,\n calls: Array<[Address, Hex]>,\n): Promise<(Hex | null)[]> {\n const client = getProvider(rpcUrl);\n\n const mcCalls = calls.map(([target, callData]) => ({\n target,\n allowFailure: true,\n callData,\n }));\n\n const result = await client.call({\n to: MULTICALL3_ADDRESS,\n data: encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [mcCalls],\n }),\n });\n\n if (!result.data) return calls.map(() => null);\n\n const decoded = decodeFunctionResult({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n data: result.data,\n }) as Array<{ success: boolean; returnData: Hex }>;\n\n return decoded.map((r) => (r.success ? r.returnData : null));\n}\n\nexport function decodeU256(data: Hex | null): bigint {\n if (!data || data.length < 66) return 0n;\n return BigInt(data.slice(0, 66));\n}\n\nexport function decodeU128(data: Hex | null): bigint {\n if (!data || data.length < 66) return 0n;\n const val = BigInt(data.slice(0, 66));\n return val & ((1n << 128n) - 1n);\n}\n","/**\n * Per-chain DEX aggregator slug map. Each entry is the chain identifier the\n * aggregator's API expects:\n * - For per-chain-named aggregators (KyberSwap, OpenOcean, LiquidSwap), this is the\n * chain slug (e.g., \"ethereum\", \"bsc\", \"base\").\n * - For chainId-based aggregators (LI.FI, Relay), use \"auto\" — the adapter falls\n * back to `chain_id` numeric.\n * - Omit a key to mark the aggregator as unsupported on that chain.\n */\nexport interface AggregatorSlugs {\n kyber?: string;\n openocean?: string;\n liquid?: string;\n lifi?: string;\n relay?: string;\n}\n\nexport class ChainConfig {\n name!: string;\n chain_id!: number;\n rpc_url!: string;\n explorer_url?: string;\n native_token!: string;\n wrapped_native?: string;\n multicall3?: string;\n aggregators?: AggregatorSlugs;\n\n effectiveRpcUrl(): string {\n const chainEnv = this.name.toUpperCase().replace(/ /g, \"_\") + \"_RPC_URL\";\n return (\n process.env[chainEnv] ??\n process.env[\"HYPEREVM_RPC_URL\"] ??\n this.rpc_url\n );\n }\n}\n","import type { Address } from \"viem\";\n\nexport enum ProtocolCategory {\n Dex = \"dex\",\n Lending = \"lending\",\n Cdp = \"cdp\",\n Bridge = \"bridge\",\n LiquidStaking = \"liquid_staking\",\n YieldSource = \"yield_source\",\n YieldAggregator = \"yield_aggregator\",\n Vault = \"vault\",\n Derivatives = \"derivatives\",\n Options = \"options\",\n LiquidityManager = \"liquidity_manager\",\n Nft = \"nft\",\n Other = \"other\",\n}\n\nexport function protocolCategoryLabel(category: ProtocolCategory): string {\n switch (category) {\n case ProtocolCategory.Dex:\n return \"DEX\";\n case ProtocolCategory.Lending:\n return \"Lending\";\n case ProtocolCategory.Cdp:\n return \"CDP\";\n case ProtocolCategory.Bridge:\n return \"Bridge\";\n case ProtocolCategory.LiquidStaking:\n return \"Liquid Staking\";\n case ProtocolCategory.YieldSource:\n return \"Yield Source\";\n case ProtocolCategory.YieldAggregator:\n return \"Yield Aggregator\";\n case ProtocolCategory.Vault:\n return \"Vault\";\n case ProtocolCategory.Derivatives:\n return \"Derivatives\";\n case ProtocolCategory.Options:\n return \"Options\";\n case ProtocolCategory.LiquidityManager:\n return \"Liquidity Manager\";\n case ProtocolCategory.Nft:\n return \"NFT\";\n case ProtocolCategory.Other:\n return \"Other\";\n }\n}\n\nexport interface PoolInfo {\n name: string;\n address: Address;\n token0: string;\n token1: string;\n tick_spacing?: number;\n gauge?: Address;\n stable?: boolean;\n}\n\n/** How rewards are read for this protocol — informs which adapter the gauge layer uses */\nexport type RewardStrategy =\n | \"on_chain_gauge\" // Solidly-style gauge.earned()\n | \"on_chain_gauge_tokenid\" // Hybra/Aerodrome CL: gauge.earned(tokenId) or earned(addr,tokenId)\n | \"on_chain_farming_center\" // Algebra eternal farming (KittenSwap)\n | \"on_chain_masterchef\" // MasterChef (PancakeSwap V3)\n | \"auto_stake\" // Ramses x(3,3) — emissions handled internally, no external claim\n | \"lp_fee_only\" // V3 swap-only fork — LP earns trading fees via NPM.collect, no emissions\n | \"off_chain_api\" // Nest — backend-signed claim tickets\n | \"none\"; // No rewards at all (very rare; usually use lp_fee_only for V3 forks)\n\n/** How native input (HYPE / ETH) is wrapped on this DEX (some forks use a non-standard pattern) */\nexport type NativeInputStyle = \"algebra-native\";\n\nexport interface ProtocolEntry {\n name: string;\n slug: string;\n category: ProtocolCategory;\n interface: string;\n chain: string;\n native?: boolean;\n /** Verified PASS via on-chain `cast call`. Setting to false hides the protocol (fail-closed). */\n verified?: boolean;\n /**\n * Whether this protocol should be exposed to runtime callers.\n * Defaults to true. Setting to false hides it from getProtocolsForChain()\n * even when verified=true (use this for protocols whose ABI/integration is incomplete).\n */\n is_active?: boolean;\n /** Non-standard native-input wrapping flow — only set when adapter needs special handling */\n native_input_style?: NativeInputStyle;\n /** How rewards are computed/claimed — drives reward strategy dispatch in factory.createGauge */\n reward_strategy?: RewardStrategy;\n /**\n * Concentrated-liquidity dialect for `interface = \"uniswap_v3\"` forks. Drives\n * adapter mint encoding & quoter selection.\n * - undefined: standard Uniswap V3 (uint24 fee in MintParams)\n * - \"slipstream\": Aerodrome/Velodrome Slipstream (int24 tickSpacing + sqrtPriceX96, 12-field MintParams)\n * - \"ramses\": Ramses CL x(3,3) (auto-stake, tickSpacing-based quoter, NPM.getPeriodReward claim)\n */\n cl_style?: \"slipstream\" | \"ramses\";\n contracts?: Record<string, Address>;\n pools?: PoolInfo[];\n description?: string;\n}\n","import { readFileSync, readdirSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse } from \"smol-toml\";\nimport { ChainConfig } from \"./chain.js\";\nimport type { TokenEntry } from \"./token.js\";\nimport { type ProtocolEntry, type PoolInfo, ProtocolCategory } from \"./protocol.js\";\n\nimport { existsSync } from \"fs\";\n\nconst __dirname = fileURLToPath(new URL(\".\", import.meta.url));\n\n// Resolve config dir: works from src/ (vitest), dist/ (built), and npm bundle (npx)\nfunction findConfigDir(): string {\n const candidates = [\n resolve(__dirname, \"../../../config\"), // from dist/registry/ (monorepo build)\n resolve(__dirname, \"../../../../config\"), // from src/registry/ (vitest)\n resolve(__dirname, \"../config\"), // from dist/ (npm bundle — config at package root)\n resolve(__dirname, \"../../config\"), // from dist/subdir (npm bundle variant)\n ];\n for (const dir of candidates) {\n if (existsSync(resolve(dir, \"chains.toml\"))) return dir;\n }\n throw new Error(`Config directory not found. Searched: ${candidates.join(\", \")}`);\n}\n\nconst CONFIG_DIR = findConfigDir();\n\nfunction readToml(relPath: string): string {\n return readFileSync(resolve(CONFIG_DIR, relPath), \"utf-8\");\n}\n\ninterface ChainConfigWrapper {\n chain: Record<string, ChainConfig>;\n}\n\ninterface TokensWrapper {\n token: TokenEntry[];\n}\n\ninterface ProtocolWrapper {\n protocol: ProtocolEntry;\n}\n\nexport class Registry {\n chains: Map<string, ChainConfig>;\n tokens: Map<string, TokenEntry[]>;\n protocols: ProtocolEntry[];\n\n private constructor(\n chains: Map<string, ChainConfig>,\n tokens: Map<string, TokenEntry[]>,\n protocols: ProtocolEntry[],\n ) {\n this.chains = chains;\n this.tokens = tokens;\n this.protocols = protocols;\n }\n\n static loadEmbedded(): Registry {\n const chains = Registry.loadChains();\n const tokens = Registry.loadTokens();\n const protocols = Registry.loadProtocols();\n return new Registry(chains, tokens, protocols);\n }\n\n private static loadChains(): Map<string, ChainConfig> {\n const raw = parse(readToml(\"chains.toml\")) as unknown as ChainConfigWrapper;\n const map = new Map<string, ChainConfig>();\n for (const [key, data] of Object.entries(raw.chain)) {\n const cfg = Object.assign(new ChainConfig(), data);\n map.set(key, cfg);\n }\n return map;\n }\n\n private static loadTokens(): Map<string, TokenEntry[]> {\n // Dynamically discover all token files in config/tokens/\n const map = new Map<string, TokenEntry[]>();\n const tokensDir = resolve(CONFIG_DIR, \"tokens\");\n try {\n const files = readdirSync(tokensDir).filter(f => f.endsWith(\".toml\"));\n for (const file of files) {\n const chain = file.replace(\".toml\", \"\");\n try {\n const raw = parse(readToml(`tokens/${file}`)) as unknown as TokensWrapper;\n map.set(chain, raw.token);\n } catch { /* skip invalid token files */ }\n }\n } catch { /* tokens dir may not exist */ }\n return map;\n }\n\n private static loadProtocols(): ProtocolEntry[] {\n // Dynamically discover all protocol TOML files across all categories\n const protocols: ProtocolEntry[] = [];\n const protocolsDir = resolve(CONFIG_DIR, \"protocols\");\n const categories = [\"dex\", \"lending\", \"cdp\", \"vault\", \"liquid_staking\", \"yield_aggregator\", \"yield_source\", \"derivatives\", \"options\", \"nft\", \"bridge\"];\n\n for (const category of categories) {\n const catDir = resolve(protocolsDir, category);\n try {\n if (!existsSync(catDir)) continue;\n const files = readdirSync(catDir).filter(f => f.endsWith(\".toml\"));\n for (const file of files) {\n try {\n const raw = parse(readToml(`protocols/${category}/${file}`)) as unknown as ProtocolWrapper;\n protocols.push(raw.protocol);\n } catch { /* skip invalid protocol files */ }\n }\n } catch { /* category dir may not exist */ }\n }\n return protocols;\n }\n\n getChain(name: string): ChainConfig {\n const chain = this.chains.get(name);\n if (!chain) throw new Error(`Chain not found: ${name}`);\n return chain;\n }\n\n getProtocol(name: string): ProtocolEntry {\n const protocol = this.protocols.find(\n (p) =>\n p.name.toLowerCase() === name.toLowerCase() ||\n p.slug.toLowerCase() === name.toLowerCase(),\n );\n if (!protocol) throw new Error(`Protocol not found: ${name}`);\n return protocol;\n }\n\n getProtocolsByCategory(category: ProtocolCategory): ProtocolEntry[] {\n return this.protocols.filter((p) => p.category === category);\n }\n\n getProtocolsForChain(chain: string, includeUnverified = false): ProtocolEntry[] {\n return this.protocols.filter(\n (p) =>\n p.chain.toLowerCase() === chain.toLowerCase() &&\n (includeUnverified || p.verified !== false) &&\n p.is_active !== false,\n );\n }\n\n resolveToken(chain: string, symbol: string): TokenEntry {\n const tokens = this.tokens.get(chain);\n if (!tokens) throw new Error(`Chain not found: ${chain}`);\n const token = tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n if (!token) throw new Error(`Token not found: ${symbol}`);\n return token;\n }\n\n /**\n * Resolve a pool by name (e.g. \"WHYPE/USDC\") from a protocol's pool list.\n * Returns the pool info or throws if not found.\n */\n resolvePool(protocolSlug: string, poolName: string): PoolInfo {\n const protocol = this.getProtocol(protocolSlug);\n if (!protocol.pools || protocol.pools.length === 0) {\n throw new Error(`Protocol ${protocol.name} has no pools configured`);\n }\n const pool = protocol.pools.find(\n (p) => p.name.toLowerCase() === poolName.toLowerCase(),\n );\n if (!pool) {\n const available = protocol.pools.map(p => p.name).join(\", \");\n throw new Error(`Pool '${poolName}' not found in ${protocol.name}. Available: ${available}`);\n }\n return pool;\n }\n}\n","import { DefiError } from \"@hypurrquant/defi-core\";\nimport type { ProtocolEntry } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\n\n// DEX adapters\nimport { UniswapV3Adapter } from \"./dex/uniswap_v3.js\";\nimport { UniswapV2Adapter } from \"./dex/uniswap_v2.js\";\nimport { AlgebraV3Adapter } from \"./dex/algebra_v3.js\";\nimport { BalancerV3Adapter } from \"./dex/balancer_v3.js\";\nimport { CurveStableSwapAdapter } from \"./dex/curve.js\";\nimport { SolidlyAdapter } from \"./dex/solidly.js\";\nimport { ThenaCLAdapter } from \"./dex/thena_cl.js\";\nimport { HybraGaugeAdapter } from \"./dex/hybra_gauge.js\";\nimport { WooFiAdapter } from \"./dex/woofi.js\";\nimport { SolidlyGaugeAdapter } from \"./dex/solidly_gauge.js\";\nimport { MasterChefAdapter } from \"./dex/masterchef.js\";\nimport { MerchantMoeLBAdapter } from \"./dex/merchant_moe_lb.js\";\nimport { KittenSwapFarmingAdapter } from \"./dex/kittenswap_farming.js\";\nimport { NestOffChainAdapter } from \"./dex/nest_offchain.js\";\n\n// Trait interfaces\nimport type { IDex } from \"@hypurrquant/defi-core\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport type { ICdp } from \"@hypurrquant/defi-core\";\nimport type { IVault } from \"@hypurrquant/defi-core\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport type { IGaugeSystem } from \"@hypurrquant/defi-core\";\nimport type { IGauge } from \"@hypurrquant/defi-core\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport type { IOptions } from \"@hypurrquant/defi-core\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport type { INft } from \"@hypurrquant/defi-core\";\n\n// Lending adapters\nimport { AaveV3Adapter } from \"./lending/aave_v3.js\";\nimport { AaveV2Adapter } from \"./lending/aave_v2.js\";\nimport { AaveOracleAdapter } from \"./lending/aave_oracle.js\";\nimport { CompoundV2Adapter } from \"./lending/compound_v2.js\";\nimport { CompoundV3Adapter } from \"./lending/compound_v3.js\";\nimport { EulerV2Adapter } from \"./lending/euler_v2.js\";\nimport { MorphoBlueAdapter } from \"./lending/morpho.js\";\n\n// CDP adapters\nimport { FelixCdpAdapter } from \"./cdp/felix.js\";\nimport { FelixOracleAdapter } from \"./cdp/felix_oracle.js\";\n\n// Vault adapters\nimport { ERC4626VaultAdapter } from \"./vault/erc4626.js\";\n\n// Liquid staking adapters\nimport { GenericLstAdapter } from \"./liquid_staking/generic_lst.js\";\nimport { StHypeAdapter } from \"./liquid_staking/sthype.js\";\nimport { KinetiqAdapter } from \"./liquid_staking/kinetiq.js\";\n\n// Yield source adapters\nimport { PendleAdapter } from \"./yield_source/pendle.js\";\nimport { GenericYieldAdapter } from \"./yield_source/generic_yield.js\";\n\n// Derivatives adapters\nimport { HlpVaultAdapter } from \"./derivatives/hlp.js\";\nimport { GenericDerivativesAdapter } from \"./derivatives/generic_derivatives.js\";\n\n// Options adapters\nimport { RyskAdapter } from \"./options/rysk.js\";\nimport { GenericOptionsAdapter } from \"./options/generic_options.js\";\n\n// NFT adapters\nimport { ERC721Adapter } from \"./nft/erc721.js\";\n\n// ============================================================\n// DEX\n// ============================================================\n\n/** Create a Dex implementation from a protocol registry entry */\nexport function createDex(entry: ProtocolEntry, rpcUrl?: string): IDex {\n switch (entry.interface) {\n case \"uniswap_v3\":\n return new UniswapV3Adapter(entry, rpcUrl);\n case \"uniswap_v4\":\n throw DefiError.unsupported(\n `[${entry.name}] Uniswap V4 (singleton PoolManager) is not yet supported — use HyperSwap V3 or another V3-compatible DEX for quotes`,\n );\n case \"algebra_v3\":\n return new AlgebraV3Adapter(entry, rpcUrl);\n case \"uniswap_v2\":\n return new UniswapV2Adapter(entry, rpcUrl);\n case \"solidly_v2\":\n case \"solidly_cl\":\n return new SolidlyAdapter(entry, rpcUrl);\n case \"hybra\":\n return new ThenaCLAdapter(entry, rpcUrl);\n case \"curve_stableswap\":\n return new CurveStableSwapAdapter(entry);\n case \"balancer_v3\":\n return new BalancerV3Adapter(entry);\n case \"woofi\":\n return new WooFiAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`DEX interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Lending\n// ============================================================\n\n/** Create a Lending implementation from a protocol registry entry */\nexport function createLending(entry: ProtocolEntry, rpcUrl?: string): ILending {\n switch (entry.interface) {\n case \"aave_v3\":\n case \"aave_v3_isolated\":\n return new AaveV3Adapter(entry, rpcUrl);\n case \"aave_v2\":\n return new AaveV2Adapter(entry, rpcUrl);\n case \"morpho_blue\":\n return new MorphoBlueAdapter(entry, rpcUrl);\n case \"euler_v2\":\n return new EulerV2Adapter(entry, rpcUrl);\n case \"compound_v2\":\n return new CompoundV2Adapter(entry, rpcUrl);\n case \"compound_v3\":\n return new CompoundV3Adapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Lending interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// CDP\n// ============================================================\n\n/** Create a CDP implementation from a protocol registry entry */\nexport function createCdp(entry: ProtocolEntry, rpcUrl?: string): ICdp {\n switch (entry.interface) {\n case \"liquity_v2\":\n return new FelixCdpAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`CDP interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Vault\n// ============================================================\n\n/** Create a Vault implementation from a protocol registry entry */\nexport function createVault(entry: ProtocolEntry, rpcUrl?: string): IVault {\n switch (entry.interface) {\n case \"erc4626\":\n case \"beefy_vault\":\n return new ERC4626VaultAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Vault interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Liquid Staking\n// ============================================================\n\n/** Create a LiquidStaking implementation from a protocol registry entry */\nexport function createLiquidStaking(entry: ProtocolEntry, rpcUrl?: string): ILiquidStaking {\n switch (entry.interface) {\n case \"kinetiq_staking\":\n return new KinetiqAdapter(entry, rpcUrl);\n case \"sthype_staking\":\n return new StHypeAdapter(entry, rpcUrl);\n case \"hyperbeat_lst\":\n case \"kintsu\":\n return new GenericLstAdapter(entry, rpcUrl);\n default:\n return new GenericLstAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Gauge\n// ============================================================\n\n/** Create a GaugeSystem implementation from a protocol registry entry */\nexport function createGauge(entry: ProtocolEntry, rpcUrl?: string, tokens?: Address[]): IGaugeSystem {\n // Hybra has its own GaugeManager system\n if (entry.interface === \"hybra\" || entry.contracts?.[\"gauge_manager\"]) {\n return new HybraGaugeAdapter(entry, rpcUrl);\n }\n switch (entry.interface) {\n case \"solidly_v2\":\n case \"solidly_cl\":\n case \"algebra_v3\":\n return new SolidlyGaugeAdapter(entry, rpcUrl, tokens);\n // uniswap_v3 with voter = ve(3,3) CL (e.g., Aerodrome Slipstream, Ramses CL)\n case \"uniswap_v3\":\n if (entry.contracts?.[\"voter\"]) return new SolidlyGaugeAdapter(entry, rpcUrl, tokens);\n throw DefiError.unsupported(`Gauge interface '${entry.interface}' not supported (no voter contract)`);\n default:\n throw DefiError.unsupported(`Gauge interface '${entry.interface}' not supported`);\n }\n}\n\n/** Create a MasterChef IGauge implementation from a protocol registry entry */\nexport function createMasterChef(entry: ProtocolEntry, rpcUrl?: string): IGauge {\n return new MasterChefAdapter(entry, rpcUrl);\n}\n\n// ============================================================\n// Yield Source (fallback to GenericYield)\n// ============================================================\n\n/** Create a YieldSource implementation — falls back to GenericYield for unknown interfaces */\nexport function createYieldSource(entry: ProtocolEntry, rpcUrl?: string): IYieldSource {\n switch (entry.interface) {\n case \"pendle_v2\":\n return new PendleAdapter(entry, rpcUrl);\n default:\n return new GenericYieldAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Derivatives (fallback to GenericDerivatives)\n// ============================================================\n\n/** Create a Derivatives implementation — falls back to GenericDerivatives for unknown interfaces */\nexport function createDerivatives(entry: ProtocolEntry, rpcUrl?: string): IDerivatives {\n switch (entry.interface) {\n case \"hlp_vault\":\n return new HlpVaultAdapter(entry, rpcUrl);\n default:\n return new GenericDerivativesAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Options (fallback to GenericOptions)\n// ============================================================\n\n/** Create an Options implementation — falls back to GenericOptions for unknown interfaces */\nexport function createOptions(entry: ProtocolEntry, rpcUrl?: string): IOptions {\n switch (entry.interface) {\n case \"rysk\":\n return new RyskAdapter(entry, rpcUrl);\n default:\n return new GenericOptionsAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// NFT\n// ============================================================\n\n/** Create an NFT implementation from a protocol registry entry */\nexport function createNft(entry: ProtocolEntry, rpcUrl?: string): INft {\n switch (entry.interface) {\n case \"erc721\":\n return new ERC721Adapter(entry, rpcUrl);\n case \"marketplace\":\n throw DefiError.unsupported(`NFT marketplace '${entry.name}' is not queryable as ERC-721. Use a specific collection address.`);\n default:\n throw DefiError.unsupported(`NFT interface '${entry.interface}' not supported`);\n }\n}\n\n// ============================================================\n// Oracle from Lending\n// ============================================================\n\n/** Create an Oracle from a lending protocol entry (Aave V3 forks have an oracle contract) */\nexport function createOracleFromLending(entry: ProtocolEntry, rpcUrl: string): IOracle {\n switch (entry.interface) {\n case \"aave_v3\":\n case \"aave_v3_isolated\":\n return new AaveOracleAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Oracle not available for lending interface '${entry.interface}'`);\n }\n}\n\n// ============================================================\n// Oracle from CDP\n// ============================================================\n\n/** Create an Oracle from a CDP protocol entry (Felix has its own PriceFeed contract) */\nexport function createOracleFromCdp(entry: ProtocolEntry, _asset: Address, rpcUrl: string): IOracle {\n switch (entry.interface) {\n case \"liquity_v2\":\n return new FelixOracleAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Oracle not available for CDP interface '${entry.interface}'`);\n }\n}\n\n// ============================================================\n// Merchant Moe LB\n// ============================================================\n\n/** Create a MerchantMoeLBAdapter for Liquidity Book operations */\nexport function createMerchantMoeLB(entry: ProtocolEntry, rpcUrl?: string): MerchantMoeLBAdapter {\n return new MerchantMoeLBAdapter(entry, rpcUrl);\n}\n\n// ============================================================\n// KittenSwap Algebra Farming\n// ============================================================\n\n// ============================================================\n// Nest Off-Chain (NEST emissions are NOT readable on-chain — backend-signed claim tickets)\n// ============================================================\n\n/** Create a NestOffChainAdapter for Nest reward queries via blaze.nest.aegas.it / usenest.xyz */\nexport function createNestOffChain(entry: ProtocolEntry): NestOffChainAdapter {\n return new NestOffChainAdapter(entry);\n}\n\n// ============================================================\n// Reward Reader — unified strategy dispatch\n// (mirrors HypurrQuant_FE packages/core/defi/lp/incentive/query/resolve.ts)\n// ============================================================\n\n/**\n * Discriminated union returned by createRewardReader. Callers narrow on `kind`\n * to access the strategy-specific adapter API.\n *\n * - off_chain_api → Nest backend-signed tickets (NestOffChainAdapter)\n * - on_chain_farming_center → Algebra Integral eternal farming (KittenSwap)\n * - on_chain_gauge_tokenid → gauge.earned(tokenId) per CL position (Hybra)\n * - on_chain_gauge → Solidly-style gauge.earned(addr) (Aerodrome V2, Thena V1)\n * - auto_stake → Ramses x(3,3): no external claim needed\n * - on_chain_masterchef → MasterChef pid→pending (PancakeSwap V3)\n * - none → Swap-only DEX, no rewards\n */\nexport type RewardReader =\n | { kind: \"off_chain_api\"; adapter: NestOffChainAdapter }\n | { kind: \"on_chain_farming_center\"; adapter: KittenSwapFarmingAdapter }\n | { kind: \"on_chain_gauge_tokenid\"; adapter: HybraGaugeAdapter }\n | { kind: \"on_chain_gauge\"; adapter: SolidlyGaugeAdapter }\n | { kind: \"auto_stake\"; adapter: SolidlyGaugeAdapter }\n | { kind: \"on_chain_masterchef\"; adapter: MasterChefAdapter }\n | { kind: \"none\" };\n\n/**\n * Build a strategy-aware reward reader for the given protocol entry.\n *\n * Reads `entry.reward_strategy` first (set in the protocol TOML). When the\n * field is missing (legacy entries), falls back to inferring from the\n * adapter `interface` and contract presence, mirroring the previous\n * implicit dispatch in createGauge.\n */\nexport function createRewardReader(\n entry: ProtocolEntry,\n rpcUrl?: string,\n tokens?: Address[],\n): RewardReader {\n const strategy = entry.reward_strategy ?? inferRewardStrategy(entry);\n\n switch (strategy) {\n case \"off_chain_api\":\n return { kind: \"off_chain_api\", adapter: new NestOffChainAdapter(entry) };\n\n case \"on_chain_farming_center\":\n if (!rpcUrl) throw DefiError.invalidParam(\"createRewardReader: rpcUrl required for on_chain_farming_center\");\n return { kind: \"on_chain_farming_center\", adapter: createKittenSwapFarming(entry, rpcUrl) };\n\n case \"on_chain_gauge_tokenid\":\n return { kind: \"on_chain_gauge_tokenid\", adapter: new HybraGaugeAdapter(entry, rpcUrl) };\n\n case \"on_chain_gauge\":\n return { kind: \"on_chain_gauge\", adapter: new SolidlyGaugeAdapter(entry, rpcUrl, tokens) };\n\n case \"auto_stake\":\n // Same adapter shape (Solidly), but caller is expected to recognize that\n // emissions accrue internally — no buildClaimRewards/getReward call needed.\n return { kind: \"auto_stake\", adapter: new SolidlyGaugeAdapter(entry, rpcUrl, tokens) };\n\n case \"on_chain_masterchef\":\n return { kind: \"on_chain_masterchef\", adapter: new MasterChefAdapter(entry, rpcUrl) };\n\n case \"none\":\n return { kind: \"none\" };\n\n default:\n throw DefiError.unsupported(`Unknown reward_strategy '${strategy}' on '${entry.slug}'`);\n }\n}\n\nfunction inferRewardStrategy(entry: ProtocolEntry): NonNullable<ProtocolEntry[\"reward_strategy\"]> {\n // Hybra has its own GaugeManager system → tokenid-keyed earned()\n if (entry.interface === \"hybra\" || entry.contracts?.[\"gauge_manager\"]) {\n return \"on_chain_gauge_tokenid\";\n }\n // Algebra eternal farming requires farming_center + eternal_farming\n if (entry.contracts?.[\"farming_center\"] && entry.contracts?.[\"eternal_farming\"]) {\n return \"on_chain_farming_center\";\n }\n // ve(3,3) gauges via voter\n if (entry.contracts?.[\"voter\"]) {\n return \"on_chain_gauge\";\n }\n // MasterChef\n if (entry.contracts?.[\"master_chef\"] || entry.contracts?.[\"masterChef\"]) {\n return \"on_chain_masterchef\";\n }\n return \"none\";\n}\n\n/** Create a KittenSwapFarmingAdapter for Algebra eternal farming operations */\nexport function createKittenSwapFarming(entry: ProtocolEntry, rpcUrl: string): KittenSwapFarmingAdapter {\n const farmingCenter = entry.contracts?.[\"farming_center\"];\n if (!farmingCenter) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${entry.name}] Missing 'farming_center' contract address`);\n }\n const eternalFarming = entry.contracts?.[\"eternal_farming\"];\n if (!eternalFarming) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${entry.name}] Missing 'eternal_farming' contract address`);\n }\n const positionManager = entry.contracts?.[\"position_manager\"];\n if (!positionManager) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${entry.name}] Missing 'position_manager' contract address`);\n }\n const factory = entry.contracts?.[\"factory\"] as Address | undefined;\n const rewardToken = entry.contracts?.[\"reward_token\"] as Address | undefined;\n const bonusRewardToken = entry.contracts?.[\"bonus_reward_token\"] as Address | undefined;\n return new KittenSwapFarmingAdapter(entry.name, farmingCenter, eternalFarming, positionManager, rpcUrl, factory, rewardToken, bonusRewardToken);\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst DEFAULT_FEE = 3000;\n\nconst swapRouterAbi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\nconst quoterAbi = parseAbi([\n \"struct QuoteExactInputSingleParams { address tokenIn; address tokenOut; uint256 amountIn; uint24 fee; uint160 sqrtPriceLimitX96; }\",\n \"function quoteExactInputSingle(QuoteExactInputSingleParams memory params) external returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)\",\n]);\n\n// Ramses CL uses tickSpacing instead of fee in the quoter struct\nconst ramsesQuoterAbi = parseAbi([\n \"struct QuoteExactInputSingleParams { address tokenIn; address tokenOut; uint256 amountIn; int24 tickSpacing; uint160 sqrtPriceLimitX96; }\",\n \"function quoteExactInputSingle(QuoteExactInputSingleParams memory params) external returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)\",\n]);\n\nconst positionManagerAbi = parseAbi([\n \"struct MintParams { address token0; address token1; uint24 fee; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n \"struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; }\",\n \"function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; }\",\n \"function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"struct IncreaseLiquidityParams { uint256 tokenId; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; uint256 deadline; }\",\n \"function increaseLiquidity(IncreaseLiquidityParams calldata params) external payable returns (uint128 liquidity, uint256 amount0, uint256 amount1)\",\n \"function positions(uint256 tokenId) external view returns (uint96 nonce, address operator, address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1)\",\n \"function multicall(bytes[] data) external payable returns (bytes[] memory results)\",\n]);\n\n// Aerodrome Slipstream / Velodrome CL NPM mint — adds int24 tickSpacing (replaces fee)\n// AND uint160 sqrtPriceX96 (12th field) for pool initialization on-the-fly.\nconst slipstreamMintAbi = parseAbi([\n \"struct SlipstreamMintParams { address token0; address token1; int24 tickSpacing; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; uint160 sqrtPriceX96; }\",\n \"function mint(SlipstreamMintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\nexport class UniswapV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly quoter: Address | undefined;\n private readonly positionManager: Address | undefined;\n private readonly factory: Address | undefined;\n private readonly fee: number;\n private readonly rpcUrl: string | undefined;\n private readonly useTickSpacingQuoter: boolean;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.quoter = entry.contracts?.[\"quoter\"];\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.factory = entry.contracts?.[\"factory\"];\n this.fee = DEFAULT_FEE;\n this.rpcUrl = rpcUrl;\n // CL dialect: Slipstream/Ramses use tickSpacing in MintParams instead of fee.\n // Prefer explicit `cl_style` config over the legacy heuristic of pool_deployer/gauge_factory.\n this.useTickSpacingQuoter = entry.cl_style === \"slipstream\"\n || entry.cl_style === \"ramses\"\n || entry.contracts?.[\"pool_deployer\"] !== undefined\n || entry.contracts?.[\"gauge_factory\"] !== undefined;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const amountOutMinimum = 0n;\n\n const data = encodeFunctionData({\n abi: swapRouterAbi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n fee: this.fee,\n recipient: params.recipient,\n deadline,\n amountIn: params.amount_in,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokenIn for tokenOut`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n\n if (this.quoter) {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // Try tickSpacing-based quoter first for Ramses CL and similar forks\n if (this.useTickSpacingQuoter) {\n const tickSpacings = [1, 10, 50, 100, 200];\n const tsResults = await Promise.allSettled(\n tickSpacings.map(async (ts) => {\n const result = await client.call({\n to: this.quoter!,\n data: encodeFunctionData({\n abi: ramsesQuoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n tickSpacing: ts,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n });\n if (!result.data) return { amountOut: 0n, tickSpacing: ts };\n const [amountOut] = decodeAbiParameters(\n [{ name: \"amountOut\", type: \"uint256\" }],\n result.data,\n );\n return { amountOut, tickSpacing: ts };\n }),\n );\n\n let best = { amountOut: 0n, tickSpacing: 50 };\n for (const r of tsResults) {\n if (r.status === \"fulfilled\" && r.value.amountOut > best.amountOut) {\n best = r.value;\n }\n }\n\n if (best.amountOut > 0n) {\n return {\n protocol: this.protocolName,\n amount_out: best.amountOut,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [`${params.token_in} -> ${params.token_out} (tickSpacing: ${best.tickSpacing})`],\n };\n }\n\n // tickSpacing-based protocol (Ramses CL): quoter returned no result.\n // Pool exists but has no liquidity in this fork snapshot.\n throw DefiError.rpcError(\n `[${this.protocolName}] No quote available — pool exists but has zero liquidity for this pair`,\n );\n }\n\n // Standard Uniswap V3 fee-based quoter\n const feeTiers = [500, 3000, 10000, 100];\n const results = await Promise.allSettled(\n feeTiers.map(async (fee) => {\n const result = await client.call({\n to: this.quoter!,\n data: encodeFunctionData({\n abi: quoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n fee,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n });\n if (!result.data) return { amountOut: 0n, fee };\n const [amountOut] = decodeAbiParameters(\n [{ name: \"amountOut\", type: \"uint256\" }],\n result.data,\n );\n return { amountOut, fee };\n }),\n );\n\n let best = { amountOut: 0n, fee: 3000 };\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value.amountOut > best.amountOut) {\n best = r.value;\n }\n }\n\n if (best.amountOut > 0n) {\n return {\n protocol: this.protocolName,\n amount_out: best.amountOut,\n price_impact_bps: undefined,\n fee_bps: Math.floor(best.fee / 10),\n route: [`${params.token_in} -> ${params.token_out} (fee: ${best.fee})`],\n };\n }\n }\n\n // Fallback: simulate swap via eth_call on the router\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const callData = encodeFunctionData({\n abi: swapRouterAbi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n fee: this.fee,\n recipient: \"0x0000000000000000000000000000000000000001\",\n deadline: BigInt(\"18446744073709551615\"),\n amountIn: params.amount_in,\n amountOutMinimum: 0n,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n let output: `0x${string}` | undefined;\n try {\n const result = await client.call({ to: this.router, data: callData });\n output = result.data;\n } catch (e: unknown) {\n const errMsg = String(e);\n if (errMsg.includes(\"STF\") || errMsg.includes(\"insufficient\")) {\n throw DefiError.unsupported(\n `[${this.protocolName}] quote unavailable — no quoter contract configured. Swap simulation requires token balance. Add a quoter address to the protocol config.`,\n );\n }\n throw DefiError.rpcError(`[${this.protocolName}] swap simulation for quote failed: ${errMsg}`);\n }\n\n const amountOut =\n output && output.length >= 66\n ? BigInt(output.slice(0, 66))\n : 0n;\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: Math.floor(this.fee / 10),\n route: [`${params.token_in} -> ${params.token_out} (simulated)`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Position manager address not configured\");\n }\n\n // Sort tokens (Uniswap V3 requires token0 < token1)\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n // V3 NPM mint: getLiquidityForAmounts uses min(L0, L1), so if either is 0\n // then liquidity=0 → revert. Use 1 wei minimum for single-side LP.\n const amount0 = rawAmount0 === 0n && rawAmount1 > 0n ? 1n : rawAmount0;\n const amount1 = rawAmount1 === 0n && rawAmount0 > 0n ? 1n : rawAmount1;\n\n // Default: full range, configured fee tier\n let thirdField: number = this.fee;\n let tickLower = -887220;\n let tickUpper = 887220;\n\n // When --pool provided + RPC, read pool's actual tickSpacing/fee + current tick.\n // For Slipstream-style forks (useTickSpacingQuoter=true), MintParams' third field is tickSpacing, not fee.\n if (params.pool && this.rpcUrl) {\n const poolAbi = parseAbi([\n \"function fee() view returns (uint24)\",\n \"function tickSpacing() view returns (int24)\",\n \"function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16, uint16, uint16, bool)\",\n ]);\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const [poolFee, poolTs, slot0] = await Promise.all([\n client.readContract({ address: params.pool, abi: poolAbi, functionName: \"fee\" }).catch(() => null) as Promise<number | null>,\n client.readContract({ address: params.pool, abi: poolAbi, functionName: \"tickSpacing\" }).catch(() => null) as Promise<number | null>,\n client.readContract({ address: params.pool, abi: poolAbi, functionName: \"slot0\" }).catch(() => null) as Promise<readonly [bigint, number, number, number, number, boolean] | null>,\n ]);\n if (this.useTickSpacingQuoter && poolTs !== null) {\n thirdField = poolTs;\n } else if (poolFee !== null) {\n thirdField = poolFee;\n }\n // Compute concentrated range from --range_pct\n if (params.range_pct !== undefined && slot0 && poolTs !== null) {\n const currentTick = slot0[1];\n // Approximation: 1 tick ≈ 0.01% (1.0001x). ±N% → ±N*100 ticks.\n const rangeTicks = Math.floor(params.range_pct * 100);\n tickLower = Math.floor((currentTick - rangeTicks) / poolTs) * poolTs;\n tickUpper = Math.ceil((currentTick + rangeTicks) / poolTs) * poolTs;\n }\n }\n // Explicit overrides\n if (params.tick_lower !== undefined) tickLower = params.tick_lower;\n if (params.tick_upper !== undefined) tickUpper = params.tick_upper;\n\n const data = this.useTickSpacingQuoter\n ? encodeFunctionData({\n abi: slipstreamMintAbi,\n functionName: \"mint\",\n args: [\n {\n token0,\n token1,\n tickSpacing: thirdField,\n tickLower,\n tickUpper,\n amount0Desired: amount0,\n amount1Desired: amount1,\n amount0Min: 0n,\n amount1Min: 0n,\n recipient: params.recipient,\n deadline: BigInt(\"18446744073709551615\"),\n sqrtPriceX96: 0n,\n },\n ],\n })\n : encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"mint\",\n args: [\n {\n token0,\n token1,\n fee: thirdField,\n tickLower,\n tickUpper,\n amount0Desired: amount0,\n amount1Desired: amount1,\n amount0Min: 0n,\n amount1Min: 0n,\n recipient: params.recipient,\n deadline: BigInt(\"18446744073709551615\"),\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 500_000,\n approvals: [\n { token: token0, spender: pm, amount: amount0 },\n { token: token1, spender: pm, amount: amount1 },\n ],\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw DefiError.contractError(\n `[${this.protocolName}] Missing 'position_manager' for liquidity removal`,\n );\n }\n if (!params.token_id) {\n throw DefiError.invalidParam(\n `[${this.protocolName}] V3 remove_liquidity requires --token-id (NFT positionId)`,\n );\n }\n const tokenId = params.token_id;\n const liquidity = params.liquidity;\n const MAX_UINT128 = (1n << 128n) - 1n;\n const deadline = BigInt(\"18446744073709551615\");\n const decreaseData = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"decreaseLiquidity\",\n args: [{ tokenId, liquidity, amount0Min: 0n, amount1Min: 0n, deadline }],\n });\n const collectData = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"collect\",\n args: [{ tokenId, recipient: params.recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n });\n const data = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"multicall\",\n args: [[decreaseData, collectData]],\n });\n return {\n description: `[${this.protocolName}] Remove ${liquidity} liquidity from tokenId ${tokenId}`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n /**\n * Collect accrued LP trading fees for a CL position via NPM.collect().\n * Used as the reward path for V3 forks with reward_strategy = \"lp_fee_only\"\n * (e.g., HyperSwap V3, Project X — no gauge/emissions, fees are the only reward).\n */\n async buildCollectFees(tokenId: bigint, recipient: Address): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw DefiError.contractError(\n `[${this.protocolName}] Missing 'position_manager' for fee collection`,\n );\n }\n const MAX_UINT128 = (1n << 128n) - 1n;\n const data = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"collect\",\n args: [{ tokenId, recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n });\n return {\n description: `[${this.protocolName}] Collect LP fees for tokenId ${tokenId}`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Compound: collect accrued fees and immediately re-add them as liquidity to the same position.\n * Flow: static-call collect to learn fee amounts → multicall([collect, increaseLiquidity]) on NPM.\n * Requires existing token approvals on the NPM (set during initial mint).\n * v1: V3 fee-only protocols (Project X, HyperSwap V3). Gauge protocols need swap routing first.\n */\n async buildCompound(tokenId: bigint, recipient: Address, opts?: { slippageBps?: number }): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw DefiError.contractError(`[${this.protocolName}] Missing 'position_manager' for compound`);\n }\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC required to preview fees\");\n const MAX_UINT128 = (1n << 128n) - 1n;\n const deadline = BigInt(\"18446744073709551615\");\n const slippageBps = BigInt(opts?.slippageBps ?? 50); // default 0.5%\n if (slippageBps > 10000n) {\n throw DefiError.invalidParam(`[${this.protocolName}] slippageBps must be <= 10000 (got ${slippageBps})`);\n }\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const sim = await client.simulateContract({\n address: pm,\n abi: positionManagerAbi,\n functionName: \"collect\",\n args: [{ tokenId, recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n account: recipient,\n });\n const [amount0, amount1] = sim.result as readonly [bigint, bigint];\n if (amount0 === 0n && amount1 === 0n) {\n throw DefiError.invalidParam(`[${this.protocolName}] No fees to compound for tokenId ${tokenId}`);\n }\n const amount0Min = (amount0 * (10000n - slippageBps)) / 10000n;\n const amount1Min = (amount1 * (10000n - slippageBps)) / 10000n;\n const collectData = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"collect\",\n args: [{ tokenId, recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n });\n const increaseData = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"increaseLiquidity\",\n args: [{ tokenId, amount0Desired: amount0, amount1Desired: amount1, amount0Min, amount1Min, deadline }],\n });\n const data = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"multicall\",\n args: [[collectData, increaseData]],\n });\n return {\n description: `[${this.protocolName}] Compound tokenId ${tokenId}: collect ${amount0}/${amount1} → increaseLiquidity (slippage ${slippageBps}bps)`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 500_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeFunctionResult, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts)\",\n \"function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity)\",\n \"function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB)\",\n \"function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts)\",\n]);\n\nconst lbQuoterAbi = parseAbi([\n \"function findBestPathFromAmountIn(address[] calldata route, uint128 amountIn) external view returns ((address[] route, address[] pairs, uint256[] binSteps, uint256[] versions, uint128[] amounts, uint128[] virtualAmountsWithoutSlippage, uint128[] fees))\",\n]);\n\nexport class UniswapV2Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly rpcUrl: string | undefined;\n private readonly lbQuoter: Address | undefined;\n private readonly lbIntermediaries: Address[];\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.lbQuoter = entry.contracts?.[\"lb_quoter\"];\n this.rpcUrl = rpcUrl;\n\n // Collect LB intermediary tokens from contracts with \"lb_mid_\" prefix\n this.lbIntermediaries = [];\n if (entry.contracts) {\n for (const [key, addr] of Object.entries(entry.contracts)) {\n if (key.startsWith(\"lb_mid_\")) {\n this.lbIntermediaries.push(addr);\n }\n }\n }\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const amountOutMin = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const path: Address[] = [params.token_in, params.token_out];\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swapExactTokensForTokens\",\n args: [params.amount_in, amountOutMin, path, params.recipient, deadline],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokens via V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 150_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n\n // Try LB (Liquidity Book) quote first if lb_quoter is configured\n if (this.lbQuoter) {\n try {\n return await this.lbQuote(params);\n } catch {\n // Fall through to V2 quote\n }\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const path: Address[] = [params.token_in, params.token_out];\n\n const result = await client.call({\n to: this.router,\n data: encodeFunctionData({\n abi,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, path],\n }),\n });\n\n if (!result.data) {\n throw DefiError.rpcError(`[${this.protocolName}] getAmountsOut returned no data`);\n }\n\n const decoded = decodeFunctionResult({\n abi,\n functionName: \"getAmountsOut\",\n data: result.data,\n }) as unknown as bigint[];\n\n const amountOut = decoded[decoded.length - 1];\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: 30,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n private async lbQuote(params: QuoteParams): Promise<QuoteResult> {\n const client = createPublicClient({ transport: http(this.rpcUrl!) });\n\n // Build candidate routes: direct + multi-hop through each intermediary\n const routes: Address[][] = [[params.token_in, params.token_out]];\n const tokenInLower = params.token_in.toLowerCase();\n const tokenOutLower = params.token_out.toLowerCase();\n for (const mid of this.lbIntermediaries) {\n if (mid.toLowerCase() !== tokenInLower && mid.toLowerCase() !== tokenOutLower) {\n routes.push([params.token_in, mid, params.token_out]);\n }\n }\n\n const lbResultParams = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"route\", type: \"address[]\" as const },\n { name: \"pairs\", type: \"address[]\" as const },\n { name: \"binSteps\", type: \"uint256[]\" as const },\n { name: \"versions\", type: \"uint256[]\" as const },\n { name: \"amounts\", type: \"uint128[]\" as const },\n { name: \"virtualAmountsWithoutSlippage\", type: \"uint128[]\" as const },\n { name: \"fees\", type: \"uint128[]\" as const },\n ],\n },\n ] as const;\n\n let bestOut = 0n;\n let bestRoute: Address[] = [];\n\n const results = await Promise.allSettled(\n routes.map(async (route) => {\n const result = await client.call({\n to: this.lbQuoter!,\n data: encodeFunctionData({\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [route, params.amount_in],\n }),\n });\n if (!result.data) return { amountOut: 0n, route };\n const [quote] = decodeAbiParameters(lbResultParams, result.data);\n const amounts = quote.amounts;\n return { amountOut: amounts[amounts.length - 1], route };\n }),\n );\n\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value.amountOut > bestOut) {\n bestOut = r.value.amountOut;\n bestRoute = r.value.route;\n }\n }\n\n if (bestOut === 0n) {\n throw DefiError.rpcError(`[${this.protocolName}] LB quote returned zero for all routes`);\n }\n\n return {\n protocol: this.protocolName,\n amount_out: bestOut,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [bestRoute.map((a) => a.slice(0, 10)).join(\" -> \") + \" (LB)\"],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"addLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n params.amount_a,\n params.amount_b,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [\n { token: params.token_a, spender: this.router, amount: params.amount_a },\n { token: params.token_b, spender: this.router, amount: params.amount_b },\n ],\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"removeLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n params.liquidity,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Remove liquidity V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeAbiParameters, concatHex, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport { rangeToTicks, alignTickUp, alignTickDown } from \"./tick_math.js\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 limitSqrtPrice; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\n// Algebra Integral quoter: path = tokenIn(20) + deployer(20) + tokenOut(20) per hop\n// Returns arrays for multi-hop results\nconst algebraQuoterAbi = parseAbi([\n \"function quoteExactInput(bytes memory path, uint256 amountIn) external returns (uint256[] memory amountOutList, uint256[] memory amountInList, uint160[] memory sqrtPriceX96AfterList, uint32[] memory initializedTicksCrossedList, uint256 gasEstimate, uint16[] memory feeList)\",\n]);\n\n// Algebra V2 / NEST-style quoter: single-hop struct\n// selector: 0x5e5e6e0f quoteExactInputSingle((address,address,uint256,uint160))\n// returns: (uint256 amountOut, uint256 amountIn, uint160 sqrtPriceX96After)\nconst algebraSingleQuoterAbi = parseAbi([\n \"function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint160 limitSqrtPrice) params) external returns (uint256 amountOut, uint256 amountIn, uint160 sqrtPriceX96After)\",\n]);\n\n// Algebra Integral NonfungiblePositionManager (includes deployer field for pool identification)\nconst algebraIntegralPmAbi = parseAbi([\n \"struct MintParams { address token0; address token1; address deployer; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\n// Algebra V2 / NEST-style NonfungiblePositionManager (no deployer field)\nconst algebraV2PmAbi = parseAbi([\n \"struct MintParams { address token0; address token1; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\n// Standard V3 NPM methods shared across Algebra Integral and V2 (decrease + collect + multicall)\nconst algebraSharedPmAbi = parseAbi([\n \"struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; }\",\n \"function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; }\",\n \"function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"function multicall(bytes[] data) external payable returns (bytes[] memory results)\",\n]);\n\nexport class AlgebraV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly quoter: Address | undefined;\n private readonly positionManager: Address | undefined;\n private readonly rpcUrl: string | undefined;\n // NEST and similar forks expose quoteExactInputSingle((address,address,uint256,uint160))\n // instead of path-based quoteExactInput. Detected by presence of pool_deployer in config.\n private readonly useSingleQuoter: boolean;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.quoter = entry.contracts?.[\"quoter\"];\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.rpcUrl = rpcUrl;\n // pool_deployer present → NEST-style single-hop struct quoter\n this.useSingleQuoter = entry.contracts?.[\"pool_deployer\"] !== undefined;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const amountOutMinimum = 0n;\n\n const data = encodeFunctionData({\n abi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n recipient: params.recipient,\n deadline,\n amountIn: params.amount_in,\n amountOutMinimum,\n limitSqrtPrice: 0n,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokenIn for tokenOut`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 250_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n if (!this.quoter) {\n throw DefiError.unsupported(\n `[${this.protocolName}] No quoter contract configured`,\n );\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // NEST and similar forks: use single-hop struct quoter\n if (this.useSingleQuoter) {\n const result = await client.call({\n to: this.quoter,\n data: encodeFunctionData({\n abi: algebraSingleQuoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n limitSqrtPrice: 0n,\n },\n ],\n }),\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] quoteExactInputSingle failed: ${e}`);\n });\n\n if (!result.data || result.data.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] quoter returned empty data`);\n }\n\n const [amountOut] = decodeAbiParameters(\n [\n { name: \"amountOut\", type: \"uint256\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"sqrtPriceX96After\", type: \"uint160\" },\n ],\n result.data,\n );\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut as bigint,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n // KittenSwap and standard Algebra Integral path: tokenIn(20) + deployer(20) + tokenOut(20) = 60 bytes\n // Standard pools use deployer=address(0) in path (CREATE2 salt without deployer prefix)\n const path = concatHex([params.token_in, zeroAddress as Address, params.token_out]);\n\n const result = await client.call({\n to: this.quoter,\n data: encodeFunctionData({\n abi: algebraQuoterAbi,\n functionName: \"quoteExactInput\",\n args: [path, params.amount_in],\n }),\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] quoteExactInput failed: ${e}`);\n });\n\n if (!result.data || result.data.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] quoter returned empty data`);\n }\n\n // Decode first element: amountOutList is an array, take the last element\n const decoded = decodeAbiParameters(\n [\n { name: \"amountOutList\", type: \"uint256[]\" },\n { name: \"amountInList\", type: \"uint256[]\" },\n { name: \"sqrtPriceX96AfterList\", type: \"uint160[]\" },\n { name: \"initializedTicksCrossedList\", type: \"uint32[]\" },\n { name: \"gasEstimate\", type: \"uint256\" },\n { name: \"feeList\", type: \"uint16[]\" },\n ],\n result.data,\n );\n\n const amountOutList = decoded[0] as readonly bigint[];\n const feeList = decoded[5] as readonly number[];\n const amountOut = amountOutList[amountOutList.length - 1];\n const fee = feeList.length > 0 ? feeList[0] : undefined;\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: fee !== undefined ? Math.floor(fee / 10) : undefined,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Position manager address not configured\");\n }\n\n // Sort tokens (Algebra requires token0 < token1)\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n let tickLower = params.tick_lower ?? -887220;\n let tickUpper = params.tick_upper ?? 887220;\n\n // Auto tick detection: --range N% or single-side\n const isSingleSide = rawAmount0 === 0n || rawAmount1 === 0n;\n const needsAutoTick = (params.range_pct !== undefined) || (isSingleSide && !params.tick_lower && !params.tick_upper);\n\n if (needsAutoTick) {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for auto tick detection\");\n const poolAddr = params.pool as Address | undefined;\n if (!poolAddr) throw new DefiError(\"CONTRACT_ERROR\", \"Pool address required (use --pool)\");\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const algebraPoolAbi = parseAbi([\n \"function globalState() view returns (uint160 price, int24 tick, uint16 lastFee, uint8 pluginConfig, uint16 communityFee, bool unlocked)\",\n \"function tickSpacing() view returns (int24)\",\n ]);\n const [globalState, spacing] = await Promise.all([\n client.readContract({ address: poolAddr, abi: algebraPoolAbi, functionName: \"globalState\" }),\n client.readContract({ address: poolAddr, abi: algebraPoolAbi, functionName: \"tickSpacing\" }),\n ]);\n const currentTick = Number(globalState[1]);\n const tickSpace = Number(spacing);\n\n if (params.range_pct !== undefined) {\n // ±N% concentrated range\n const range = rangeToTicks(currentTick, params.range_pct, tickSpace);\n tickLower = range.tickLower;\n tickUpper = range.tickUpper;\n } else if (rawAmount0 > 0n && rawAmount1 === 0n) {\n tickLower = alignTickUp(currentTick + tickSpace, tickSpace);\n tickUpper = 887220;\n } else {\n tickLower = -887220;\n tickUpper = alignTickDown(currentTick - tickSpace, tickSpace);\n }\n }\n\n const amount0 = rawAmount0;\n const amount1 = rawAmount1;\n\n // Algebra V2 (NEST-style, has pool_deployer) uses no deployer field in MintParams\n // Algebra Integral (KittenSwap) includes deployer field\n const data = this.useSingleQuoter\n ? encodeFunctionData({\n abi: algebraV2PmAbi,\n functionName: \"mint\",\n args: [{ token0, token1, tickLower, tickUpper, amount0Desired: amount0, amount1Desired: amount1, amount0Min: 0n, amount1Min: 0n, recipient: params.recipient, deadline: BigInt(\"18446744073709551615\") }],\n })\n : encodeFunctionData({\n abi: algebraIntegralPmAbi,\n functionName: \"mint\",\n args: [{ token0, token1, deployer: zeroAddress as Address, tickLower, tickUpper, amount0Desired: amount0, amount1Desired: amount1, amount0Min: 0n, amount1Min: 0n, recipient: params.recipient, deadline: BigInt(\"18446744073709551615\") }],\n });\n\n // Only add approvals for non-zero amounts\n const approvals: { token: Address; spender: Address; amount: bigint }[] = [];\n if (amount0 > 0n) approvals.push({ token: token0, spender: pm, amount: amount0 });\n if (amount1 > 0n) approvals.push({ token: token1, spender: pm, amount: amount1 });\n\n return {\n description: `[${this.protocolName}] Add liquidity [${tickLower}, ${tickUpper}]`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 500_000,\n approvals,\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) throw DefiError.contractError(`[${this.protocolName}] Missing 'position_manager'`);\n if (!params.token_id) throw DefiError.invalidParam(`[${this.protocolName}] V3 remove_liquidity requires --token-id`);\n const MAX_UINT128 = (1n << 128n) - 1n;\n const deadline = BigInt(\"18446744073709551615\");\n const decreaseData = encodeFunctionData({\n abi: algebraSharedPmAbi, functionName: \"decreaseLiquidity\",\n args: [{ tokenId: params.token_id, liquidity: params.liquidity, amount0Min: 0n, amount1Min: 0n, deadline }],\n });\n const collectData = encodeFunctionData({\n abi: algebraSharedPmAbi, functionName: \"collect\",\n args: [{ tokenId: params.token_id, recipient: params.recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n });\n const data = encodeFunctionData({\n abi: algebraSharedPmAbi, functionName: \"multicall\",\n args: [[decreaseData, collectData]],\n });\n return {\n description: `[${this.protocolName}] Remove ${params.liquidity} liquidity from tokenId ${params.token_id}`,\n to: pm, data, value: 0n, gas_estimate: 400_000,\n };\n }\n}\n","/**\n * Convert a ±percentage to tick delta.\n * tickDelta = ln(1 + pct/100) / ln(1.0001)\n */\nexport function pctToTickDelta(pct: number): number {\n return Math.round(Math.log(1 + pct / 100) / Math.log(1.0001));\n}\n\n/**\n * Align a tick down to the nearest multiple of tickSpacing.\n */\nexport function alignTickDown(tick: number, tickSpacing: number): number {\n return Math.floor(tick / tickSpacing) * tickSpacing;\n}\n\n/**\n * Align a tick up to the nearest multiple of tickSpacing.\n */\nexport function alignTickUp(tick: number, tickSpacing: number): number {\n return Math.ceil(tick / tickSpacing) * tickSpacing;\n}\n\n/**\n * Calculate ±pct% tick range centered on currentTick, aligned to tickSpacing.\n */\nexport function rangeToTicks(\n currentTick: number,\n rangePct: number,\n tickSpacing: number,\n): { tickLower: number; tickUpper: number } {\n const delta = pctToTickDelta(rangePct);\n return {\n tickLower: alignTickDown(currentTick - delta, tickSpacing),\n tickUpper: alignTickUp(currentTick + delta, tickSpacing),\n };\n}\n","import { encodeFunctionData, parseAbi, zeroAddress } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swapSingleTokenExactIn(address pool, address tokenIn, address tokenOut, uint256 exactAmountIn, uint256 minAmountOut, uint256 deadline, bool wethIsEth, bytes calldata userData) external returns (uint256 amountOut)\",\n]);\n\nexport class BalancerV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const minAmountOut = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n\n // Balancer V3 requires a pool address. For now use a simplified single-pool swap.\n // In production, the pool would be resolved from the registry or an on-chain query.\n const data = encodeFunctionData({\n abi,\n functionName: \"swapSingleTokenExactIn\",\n args: [\n zeroAddress, // TODO: resolve pool from registry\n params.token_in,\n params.token_out,\n params.amount_in,\n minAmountOut,\n deadline,\n false,\n \"0x\",\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} via Balancer V3`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC`);\n }\n\n async buildAddLiquidity(_params: AddLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] add_liquidity requires pool-specific params`);\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] remove_liquidity requires pool-specific params`);\n }\n}\n","import { encodeFunctionData, parseAbi } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst poolAbi = parseAbi([\n \"function exchange(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns (uint256)\",\n \"function get_dy(int128 i, int128 j, uint256 dx) external view returns (uint256)\",\n \"function add_liquidity(uint256[2] amounts, uint256 min_mint_amount) external returns (uint256)\",\n \"function remove_liquidity(uint256 amount, uint256[2] min_amounts) external returns (uint256[2])\",\n]);\n\nexport class CurveStableSwapAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n // Direct pool exchange: swap token at index 0 for token at index 1.\n // The `router` address is treated as the pool address for direct swaps.\n // Callers should set the pool address as the \"router\" contract in the registry\n // when targeting a specific Curve pool.\n // Without prior quote, set min output to 0. Use quote() first for slippage protection.\n const minDy = 0n;\n\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"exchange\",\n args: [0n, 1n, params.amount_in, minDy],\n });\n\n return {\n description: `[${this.protocolName}] Curve pool exchange ${params.amount_in} tokens (index 0 -> 1)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC connection`);\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n // Add liquidity to a 2-token Curve pool\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"add_liquidity\",\n args: [[params.amount_a, params.amount_b], 0n],\n });\n\n return {\n description: `[${this.protocolName}] Curve add liquidity`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n // Remove liquidity from a 2-token Curve pool\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"remove_liquidity\",\n args: [params.liquidity, [0n, 0n]],\n });\n\n return {\n description: `[${this.protocolName}] Curve remove liquidity`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"struct Route { address from; address to; bool stable; }\",\n \"function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, (address from, address to, bool stable)[] calldata routes, address to, uint256 deadline) external returns (uint256[] memory amounts)\",\n \"function getAmountsOut(uint256 amountIn, (address from, address to, bool stable)[] calldata routes) external view returns (uint256[] memory amounts)\",\n \"function addLiquidity(address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity)\",\n \"function removeLiquidity(address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB)\",\n]);\n\n// Velodrome V2 / Aerodrome style: Route includes factory address\nconst abiV2 = parseAbi([\n \"function getAmountsOut(uint256 amountIn, (address from, address to, bool stable, address factory)[] calldata routes) external view returns (uint256[] memory amounts)\",\n]);\n\nexport class SolidlyAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n /** Default to volatile (false). True for stablecoin pairs. */\n private readonly defaultStable: boolean;\n private readonly rpcUrl: string | undefined;\n /** Factory address — present on Velodrome V2 / Aerodrome forks */\n private readonly factory: Address | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.defaultStable = false;\n this.rpcUrl = rpcUrl;\n this.factory = entry.contracts?.[\"factory\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const amountOutMin = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n\n const routes = [\n { from: params.token_in, to: params.token_out, stable: this.defaultStable },\n ];\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swapExactTokensForTokens\",\n args: [params.amount_in, amountOutMin, routes, params.recipient, deadline],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokens via Solidly`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n private encodeV1(params: QuoteParams, stable: boolean): `0x${string}` {\n return encodeFunctionData({\n abi,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, [{ from: params.token_in, to: params.token_out, stable }]],\n });\n }\n\n private encodeV2(params: QuoteParams, stable: boolean): `0x${string}` {\n return encodeFunctionData({\n abi: abiV2,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, [{ from: params.token_in, to: params.token_out, stable, factory: this.factory! }]],\n });\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n\n // Build all route variant candidates in one multicall batch.\n // Order: V2 variants first (if factory present), then V1 volatile + stable.\n const candidates: Array<{ callData: `0x${string}`; stable: boolean }> = [\n { callData: this.encodeV1(params, false), stable: false },\n { callData: this.encodeV1(params, true), stable: true },\n ];\n if (this.factory) {\n candidates.unshift(\n { callData: this.encodeV2(params, false), stable: false },\n { callData: this.encodeV2(params, true), stable: true },\n );\n }\n\n const rawResults = await multicallRead(\n this.rpcUrl,\n candidates.map((c) => [this.router, c.callData]),\n );\n\n let bestOut = 0n;\n let bestStable = false;\n for (let i = 0; i < rawResults.length; i++) {\n const raw = rawResults[i];\n if (!raw) continue;\n try {\n const [amounts] = decodeAbiParameters(\n [{ name: \"amounts\", type: \"uint256[]\" }],\n raw,\n );\n const out = amounts.length >= 2 ? amounts[amounts.length - 1] : 0n;\n if (out > bestOut) {\n bestOut = out;\n bestStable = candidates[i].stable;\n }\n } catch {\n // Route failed — skip\n }\n }\n\n if (bestOut === 0n) {\n throw DefiError.rpcError(`[${this.protocolName}] getAmountsOut returned zero for all routes`);\n }\n\n return {\n protocol: this.protocolName,\n amount_out: bestOut,\n price_impact_bps: undefined,\n fee_bps: bestStable ? 4 : 20,\n route: [`${params.token_in} -> ${params.token_out} (stable: ${bestStable})`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"addLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n this.defaultStable,\n params.amount_a,\n params.amount_b,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity (Solidly)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 350_000,\n approvals: [\n { token: params.token_a, spender: this.router, amount: params.amount_a },\n { token: params.token_b, spender: this.router, amount: params.amount_b },\n ],\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"removeLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n this.defaultStable,\n params.liquidity,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Remove liquidity (Solidly)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport { rangeToTicks, alignTickUp, alignTickDown } from \"./tick_math.js\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\n// Thena V3 CL NonfungiblePositionManager (includes tickSpacing + sqrtPriceX96 in MintParams)\nconst thenaPmAbi = parseAbi([\n \"struct MintParams { address token0; address token1; int24 tickSpacing; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; uint160 sqrtPriceX96; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n \"struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; }\",\n \"function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; }\",\n \"function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"function multicall(bytes[] data) external payable returns (bytes[] memory results)\",\n]);\n\nconst thenaRouterAbi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; int24 tickSpacing; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\nconst thenaPoolAbi = parseAbi([\n \"function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, bool unlocked)\",\n \"function tickSpacing() view returns (int24)\",\n \"function token0() view returns (address)\",\n \"function token1() view returns (address)\",\n]);\n\nconst thenaFactoryAbi = parseAbi([\n \"function getPool(address tokenA, address tokenB, int24 tickSpacing) view returns (address)\",\n]);\n\nexport class ThenaCLAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly positionManager: Address | undefined;\n private readonly factory: Address | undefined;\n private readonly rpcUrl: string | undefined;\n private readonly defaultTickSpacing: number;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n this.router = router;\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.factory = entry.contracts?.[\"pool_factory\"];\n this.rpcUrl = rpcUrl;\n this.defaultTickSpacing = 50;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: thenaRouterAbi,\n functionName: \"exactInputSingle\",\n args: [{\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n tickSpacing: this.defaultTickSpacing,\n recipient: params.recipient,\n deadline: BigInt(params.deadline ?? 18446744073709551615n),\n amountIn: params.amount_in,\n amountOutMinimum: 0n,\n sqrtPriceLimitX96: 0n,\n }],\n });\n return {\n description: `[${this.protocolName}] Swap`,\n to: this.router, data, value: 0n, gas_estimate: 300_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote not yet implemented — use swap router`);\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) throw new DefiError(\"CONTRACT_ERROR\", \"Position manager not configured\");\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n\n // Sort tokens\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n // Resolve pool and tick range\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const poolAddr = params.pool as Address | undefined;\n let tickSpacing = this.defaultTickSpacing;\n let tickLower = params.tick_lower ?? 0;\n let tickUpper = params.tick_upper ?? 0;\n\n // If pool provided or we need to auto-detect ticks\n if (poolAddr || !params.tick_lower || !params.tick_upper) {\n let pool = poolAddr;\n if (!pool && this.factory) {\n pool = await client.readContract({\n address: this.factory, abi: thenaFactoryAbi, functionName: \"getPool\",\n args: [token0, token1, tickSpacing],\n }) as Address;\n if (pool === zeroAddress) throw new DefiError(\"CONTRACT_ERROR\", \"Pool not found\");\n }\n if (pool) {\n const [slot0, ts] = await Promise.all([\n client.readContract({ address: pool, abi: thenaPoolAbi, functionName: \"slot0\" }),\n client.readContract({ address: pool, abi: thenaPoolAbi, functionName: \"tickSpacing\" }),\n ]);\n const currentTick = Number((slot0 as readonly [bigint, number, ...unknown[]])[1]);\n tickSpacing = Number(ts);\n\n if (params.range_pct !== undefined) {\n // ±N% concentrated range\n const range = rangeToTicks(currentTick, params.range_pct, tickSpacing);\n tickLower = range.tickLower;\n tickUpper = range.tickUpper;\n } else if (!params.tick_lower && !params.tick_upper) {\n const isSingleSide = rawAmount0 === 0n || rawAmount1 === 0n;\n if (isSingleSide) {\n if (rawAmount0 > 0n) {\n tickLower = alignTickUp(currentTick + tickSpacing, tickSpacing);\n tickUpper = Math.floor(887272 / tickSpacing) * tickSpacing;\n } else {\n tickLower = Math.ceil(-887272 / tickSpacing) * tickSpacing;\n tickUpper = alignTickDown(currentTick - tickSpacing, tickSpacing);\n }\n } else {\n tickLower = Math.ceil(-887272 / tickSpacing) * tickSpacing;\n tickUpper = Math.floor(887272 / tickSpacing) * tickSpacing;\n }\n }\n }\n }\n\n // Apply explicit tick params (override auto-detected)\n if (params.tick_lower !== undefined) tickLower = params.tick_lower;\n if (params.tick_upper !== undefined) tickUpper = params.tick_upper;\n\n const data = encodeFunctionData({\n abi: thenaPmAbi,\n functionName: \"mint\",\n args: [{\n token0, token1,\n tickSpacing,\n tickLower, tickUpper,\n amount0Desired: rawAmount0,\n amount1Desired: rawAmount1,\n amount0Min: 0n, amount1Min: 0n,\n recipient: params.recipient,\n deadline: BigInt(\"18446744073709551615\"),\n sqrtPriceX96: 0n,\n }],\n });\n\n const approvals: { token: Address; spender: Address; amount: bigint }[] = [];\n if (rawAmount0 > 0n) approvals.push({ token: token0, spender: pm, amount: rawAmount0 });\n if (rawAmount1 > 0n) approvals.push({ token: token1, spender: pm, amount: rawAmount1 });\n\n return {\n description: `[${this.protocolName}] Add liquidity [${tickLower}, ${tickUpper}]`,\n to: pm, data, value: 0n, gas_estimate: 700_000, approvals,\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) throw DefiError.contractError(`[${this.protocolName}] Missing 'position_manager'`);\n if (!params.token_id) throw DefiError.invalidParam(`[${this.protocolName}] V3 remove_liquidity requires --token-id`);\n const MAX_UINT128 = (1n << 128n) - 1n;\n const deadline = BigInt(\"18446744073709551615\");\n const decreaseData = encodeFunctionData({\n abi: thenaPmAbi, functionName: \"decreaseLiquidity\",\n args: [{ tokenId: params.token_id, liquidity: params.liquidity, amount0Min: 0n, amount1Min: 0n, deadline }],\n });\n const collectData = encodeFunctionData({\n abi: thenaPmAbi, functionName: \"collect\",\n args: [{ tokenId: params.token_id, recipient: params.recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n });\n const data = encodeFunctionData({\n abi: thenaPmAbi, functionName: \"multicall\",\n args: [[decreaseData, collectData]],\n });\n return {\n description: `[${this.protocolName}] Remove ${params.liquidity} liquidity from tokenId ${params.token_id}`,\n to: pm, data, value: 0n, gas_estimate: 400_000,\n };\n }\n}\n","import { createPublicClient, decodeFunctionResult, encodeFunctionData, http, parseAbi, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type {\n IGaugeSystem,\n GaugedPool,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\n// Multicall decode helpers\nconst _addressDecodeAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressDecodeAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\nconst _symbolDecodeAbi = parseAbi([\"function symbol() external view returns (string)\"]);\nfunction decodeSymbol(data: Hex | null): string {\n if (!data) return \"?\";\n try {\n return decodeFunctionResult({ abi: _symbolDecodeAbi, functionName: \"symbol\", data }) as string;\n } catch {\n return \"?\";\n }\n}\n\nconst gaugeManagerAbi = parseAbi([\n \"function gauges(address pool) view returns (address gauge)\",\n \"function isGauge(address gauge) view returns (bool)\",\n \"function isAlive(address gauge) view returns (bool)\",\n \"function claimRewards(address gauge, uint256[] tokenIds, uint8 redeemType) external\",\n]);\n\nconst gaugeCLAbi = parseAbi([\n \"function deposit(uint256 tokenId) external\",\n \"function withdraw(uint256 tokenId, uint8 redeemType) external\",\n \"function earned(uint256 tokenId) view returns (uint256)\",\n \"function balanceOf(uint256 tokenId) view returns (uint256)\",\n \"function rewardToken() view returns (address)\",\n]);\n\nconst nfpmAbi = parseAbi([\n \"function approve(address to, uint256 tokenId) external\",\n \"function getApproved(uint256 tokenId) view returns (address)\",\n]);\n\nconst veAbi = parseAbi([\n \"function create_lock(uint256 value, uint256 lock_duration) external returns (uint256)\",\n \"function increase_amount(uint256 tokenId, uint256 value) external\",\n \"function increase_unlock_time(uint256 tokenId, uint256 lock_duration) external\",\n \"function withdraw(uint256 tokenId) external\",\n]);\n\nconst voterAbi = parseAbi([\n \"function vote(uint256 tokenId, address[] pools, uint256[] weights) external\",\n \"function claimBribes(address[] bribes, address[][] tokens, uint256 tokenId) external\",\n \"function claimFees(address[] fees, address[][] tokens, uint256 tokenId) external\",\n]);\n\n/**\n * Hybra ve(3,3) Gauge adapter using GaugeManager pattern.\n * CL gauges require NFT deposit and claim goes through GaugeManager (not directly to gauge).\n */\nexport class HybraGaugeAdapter implements IGaugeSystem {\n private readonly protocolName: string;\n private readonly gaugeManager: Address;\n private readonly veToken: Address;\n private readonly voter: Address;\n private readonly positionManager: Address;\n private readonly poolFactory: Address | undefined;\n private readonly rpcUrl: string | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const gm = entry.contracts?.[\"gauge_manager\"];\n if (!gm) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'gauge_manager' contract\");\n this.gaugeManager = gm;\n const ve = entry.contracts?.[\"ve_token\"];\n if (!ve) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 've_token' contract\");\n this.veToken = ve;\n this.voter = entry.contracts?.[\"voter\"] ?? zeroAddress as Address;\n this.positionManager = entry.contracts?.[\"position_manager\"] ?? zeroAddress as Address;\n this.poolFactory = entry.contracts?.[\"pool_factory\"];\n this.rpcUrl = rpcUrl;\n }\n\n name(): string { return this.protocolName; }\n\n // ─── Gauge Discovery ──────────────────────────────────────\n\n async discoverGaugedPools(): Promise<GaugedPool[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for gauge discovery\");\n if (!this.poolFactory) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'pool_factory' contract\");\n\n const factoryAbi = parseAbi([\n \"function allPoolsLength() external view returns (uint256)\",\n \"function allPools(uint256) external view returns (address)\",\n ]);\n const poolAbi = parseAbi([\n \"function token0() external view returns (address)\",\n \"function token1() external view returns (address)\",\n ]);\n const erc20SymbolAbi = parseAbi([\"function symbol() external view returns (string)\"]);\n const gaugesAbi = parseAbi([\"function gauges(address pool) view returns (address gauge)\"]);\n\n // Step 1: get total pool count\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n let poolCount: bigint;\n try {\n poolCount = await client.readContract({\n address: this.poolFactory,\n abi: factoryAbi,\n functionName: \"allPoolsLength\",\n }) as bigint;\n } catch {\n return [];\n }\n\n const count = Number(poolCount);\n if (count === 0) return [];\n\n // Step 2: batch-fetch all pool addresses\n const poolAddressCalls: Array<[Address, Hex]> = [];\n for (let i = 0; i < count; i++) {\n poolAddressCalls.push([\n this.poolFactory,\n encodeFunctionData({ abi: factoryAbi, functionName: \"allPools\", args: [BigInt(i)] }),\n ]);\n }\n const poolAddressResults = await multicallRead(this.rpcUrl, poolAddressCalls);\n const pools: Address[] = poolAddressResults\n .map((r) => decodeAddress(r))\n .filter((a): a is Address => a !== null && a !== zeroAddress);\n\n if (pools.length === 0) return [];\n\n // Step 3: batch GaugeManager.gauges(pool) for all pools\n const gaugeCalls: Array<[Address, Hex]> = pools.map((pool) => [\n this.gaugeManager,\n encodeFunctionData({ abi: gaugesAbi, functionName: \"gauges\", args: [pool] }),\n ]);\n const gaugeResults = await multicallRead(this.rpcUrl, gaugeCalls);\n\n // Filter pools that have an active gauge\n const gaugedPools: Array<{ pool: Address; gauge: Address }> = [];\n for (let i = 0; i < pools.length; i++) {\n const gauge = decodeAddress(gaugeResults[i] ?? null);\n if (gauge && gauge !== zeroAddress) {\n gaugedPools.push({ pool: pools[i]!, gauge });\n }\n }\n\n if (gaugedPools.length === 0) return [];\n\n // Step 4: batch token0() and token1() for gauged pools\n const tokenCalls: Array<[Address, Hex]> = [];\n for (const { pool } of gaugedPools) {\n tokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token0\" })]);\n tokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token1\" })]);\n }\n const tokenResults = await multicallRead(this.rpcUrl, tokenCalls);\n\n // Step 5: collect unique token addresses and fetch symbols\n const tokenAddrs = new Set<Address>();\n for (let i = 0; i < gaugedPools.length; i++) {\n const t0 = decodeAddress(tokenResults[i * 2] ?? null);\n const t1 = decodeAddress(tokenResults[i * 2 + 1] ?? null);\n if (t0 && t0 !== zeroAddress) tokenAddrs.add(t0);\n if (t1 && t1 !== zeroAddress) tokenAddrs.add(t1);\n }\n\n const uniqueTokens = Array.from(tokenAddrs);\n const symbolCalls: Array<[Address, Hex]> = uniqueTokens.map((t) => [\n t,\n encodeFunctionData({ abi: erc20SymbolAbi, functionName: \"symbol\" }),\n ]);\n const symbolResults = await multicallRead(this.rpcUrl, symbolCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeSymbol(symbolResults[i] ?? null));\n }\n\n // Step 6: assemble results\n const out: GaugedPool[] = [];\n for (let i = 0; i < gaugedPools.length; i++) {\n const { pool, gauge } = gaugedPools[i]!;\n const t0 = decodeAddress(tokenResults[i * 2] ?? null);\n const t1 = decodeAddress(tokenResults[i * 2 + 1] ?? null);\n out.push({\n pool,\n gauge,\n token0: t0 ? (symbolMap.get(t0) ?? t0.slice(0, 10)) : \"?\",\n token1: t1 ? (symbolMap.get(t1) ?? t1.slice(0, 10)) : \"?\",\n token0Addr: t0 ?? undefined,\n token1Addr: t1 ?? undefined,\n type: \"CL\",\n });\n }\n\n return out;\n }\n\n // ─── Gauge Lookup ──────────────────────────────────────────\n\n async resolveGauge(pool: Address): Promise<Address> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const gauge = await client.readContract({\n address: this.gaugeManager, abi: gaugeManagerAbi,\n functionName: \"gauges\", args: [pool],\n }) as Address;\n if (gauge === zeroAddress) throw new DefiError(\"CONTRACT_ERROR\", `No gauge for pool ${pool}`);\n return gauge;\n }\n\n // ─── CL Gauge: NFT Deposit/Withdraw ──────────────────────────\n\n async buildDeposit(gauge: Address, _amount: bigint, tokenId?: bigint): Promise<DeFiTx> {\n if (tokenId === undefined) throw new DefiError(\"CONTRACT_ERROR\", \"tokenId required for CL gauge deposit\");\n\n // Pre-tx: approve NFT to gauge\n const approveTx: DeFiTx = {\n description: `[${this.protocolName}] Approve NFT #${tokenId} to gauge`,\n to: this.positionManager,\n data: encodeFunctionData({ abi: nfpmAbi, functionName: \"approve\", args: [gauge, tokenId] }),\n value: 0n, gas_estimate: 80_000,\n };\n\n return {\n description: `[${this.protocolName}] Deposit NFT #${tokenId} to gauge`,\n to: gauge,\n data: encodeFunctionData({ abi: gaugeCLAbi, functionName: \"deposit\", args: [tokenId] }),\n value: 0n, gas_estimate: 500_000,\n pre_txs: [approveTx],\n };\n }\n\n async buildWithdraw(gauge: Address, _amount: bigint, tokenId?: bigint, opts?: { redeemType?: number }): Promise<DeFiTx> {\n if (tokenId === undefined) throw new DefiError(\"CONTRACT_ERROR\", \"tokenId required for CL gauge withdraw\");\n const redeemType = opts?.redeemType ?? 1;\n const warning = redeemType === 1\n ? \" — WARNING: redeemType=1 locks accumulated rewards into 2-year veHYBR NFT. Use --redeem-type 0 for instant exit (with penalty).\"\n : \"\";\n return {\n description: `[${this.protocolName}] Withdraw NFT #${tokenId} from gauge (redeemType=${redeemType})${warning}`,\n to: gauge,\n data: encodeFunctionData({ abi: gaugeCLAbi, functionName: \"withdraw\", args: [tokenId, redeemType] }),\n value: 0n, gas_estimate: 1_000_000,\n };\n }\n\n // ─── Claim: via GaugeManager ──────────────────────────────────\n\n async buildClaimRewards(gauge: Address, _account?: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] Use buildClaimRewardsByTokenId for CL gauges`);\n }\n\n async buildClaimRewardsByTokenId(gauge: Address, tokenId: bigint, opts?: { redeemType?: number }): Promise<DeFiTx> {\n // redeemType: 0 = instant exit (with penalty), 1 = lock into 2-year veHYBR (default)\n const redeemType = opts?.redeemType ?? 1;\n return {\n description: `[${this.protocolName}] Claim rewards for NFT #${tokenId} (redeemType=${redeemType})`,\n to: this.gaugeManager,\n data: encodeFunctionData({\n abi: gaugeManagerAbi, functionName: \"claimRewards\",\n args: [gauge, [tokenId], redeemType],\n }),\n value: 0n, gas_estimate: 1_000_000,\n };\n }\n\n // ─── Pending Rewards ──────────────────────────────────────────\n\n async getPendingRewards(gauge: Address, _user: Address): Promise<RewardInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] Use getPendingRewardsByTokenId for CL gauges`);\n }\n\n async getPendingRewardsByTokenId(gauge: Address, tokenId: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return await client.readContract({\n address: gauge, abi: gaugeCLAbi,\n functionName: \"earned\", args: [tokenId],\n }) as bigint;\n }\n\n // ─── VoteEscrow ──────────────────────────────────────────────\n\n async buildCreateLock(amount: bigint, lockDuration: number): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Create veNFT lock`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"create_lock\", args: [amount, BigInt(lockDuration)] }),\n value: 0n, gas_estimate: 300_000,\n };\n }\n\n async buildIncreaseAmount(tokenId: bigint, amount: bigint): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Increase veNFT #${tokenId}`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"increase_amount\", args: [tokenId, amount] }),\n value: 0n, gas_estimate: 200_000,\n };\n }\n\n async buildIncreaseUnlockTime(tokenId: bigint, lockDuration: number): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Extend veNFT #${tokenId} lock`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"increase_unlock_time\", args: [tokenId, BigInt(lockDuration)] }),\n value: 0n, gas_estimate: 200_000,\n };\n }\n\n async buildWithdrawExpired(tokenId: bigint): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Withdraw expired veNFT #${tokenId}`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"withdraw\", args: [tokenId] }),\n value: 0n, gas_estimate: 200_000,\n };\n }\n\n // ─── Voter ──────────────────────────────────────────────────\n\n async buildVote(tokenId: bigint, pools: Address[], weights: bigint[]): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Vote with veNFT #${tokenId}`,\n to: this.voter,\n data: encodeFunctionData({ abi: voterAbi, functionName: \"vote\", args: [tokenId, pools, weights] }),\n value: 0n, gas_estimate: 500_000,\n };\n }\n\n async buildClaimBribes(bribes: Address[], tokenId: bigint): Promise<DeFiTx> {\n const tokensPerBribe: Address[][] = bribes.map(() => []);\n return {\n description: `[${this.protocolName}] Claim bribes for veNFT #${tokenId}`,\n to: this.voter,\n data: encodeFunctionData({ abi: voterAbi, functionName: \"claimBribes\", args: [bribes, tokensPerBribe, tokenId] }),\n value: 0n, gas_estimate: 300_000,\n };\n }\n\n async buildClaimFees(fees: Address[], tokenId: bigint): Promise<DeFiTx> {\n const tokensPerFee: Address[][] = fees.map(() => []);\n return {\n description: `[${this.protocolName}] Claim fees for veNFT #${tokenId}`,\n to: this.voter,\n data: encodeFunctionData({ abi: voterAbi, functionName: \"claimFees\", args: [fees, tokensPerFee, tokenId] }),\n value: 0n, gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, zeroAddress } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swap(address fromToken, address toToken, uint256 fromAmount, uint256 minToAmount, address to, address rebateTo) external payable returns (uint256 realToAmount)\",\n]);\n\nexport class WooFiAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const minToAmount = 0n;\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swap\",\n args: [\n params.token_in,\n params.token_out,\n params.amount_in,\n minToAmount,\n params.recipient,\n zeroAddress,\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} via WOOFi`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC`);\n }\n\n async buildAddLiquidity(_params: AddLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] WOOFi does not support LP positions via router`);\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] WOOFi does not support LP positions via router`);\n }\n}\n","import { createPublicClient, decodeFunctionResult, encodeFunctionData, http, parseAbi, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type {\n IGaugeSystem,\n GaugedPool,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst gaugeAbi = parseAbi([\n \"function deposit(uint256 amount) external\",\n \"function depositFor(uint256 amount, uint256 tokenId) external\",\n \"function withdraw(uint256 amount) external\",\n \"function getReward() external\",\n \"function getReward(address account) external\",\n \"function getReward(address account, address[] tokens) external\",\n \"function getReward(uint256 tokenId) external\",\n // Ramses CL gauge factory (delegate target): tokenId-keyed multi-token claim\n \"function getReward(uint256 tokenId, address[] tokens) external\",\n \"function earned(address account) external view returns (uint256)\",\n \"function earned(address account, uint256 tokenId) external view returns (uint256)\",\n \"function earned(address token, address account) external view returns (uint256)\",\n \"function earned(uint256 tokenId) external view returns (uint256)\",\n // Ramses CL: token-first + tokenId (no account; account is ownerOf(tokenId) inferred by gauge)\n \"function earned(address token, uint256 tokenId) external view returns (uint256)\",\n \"function rewardRate() external view returns (uint256)\",\n \"function rewardToken() external view returns (address)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function rewardsListLength() external view returns (uint256)\",\n \"function rewardData(address token) external view returns (uint256 periodFinish, uint256 rewardRate, uint256 lastUpdateTime, uint256 rewardPerTokenStored)\",\n // Ramses CL gauge factory exposes the canonical reward-token list\n \"function getRewardTokens() external view returns (address[])\",\n \"function nonfungiblePositionManager() external view returns (address)\",\n]);\n\nconst veAbi = parseAbi([\n \"function create_lock(uint256 value, uint256 lock_duration) external returns (uint256)\",\n \"function increase_amount(uint256 tokenId, uint256 value) external\",\n \"function increase_unlock_time(uint256 tokenId, uint256 lock_duration) external\",\n \"function withdraw(uint256 tokenId) external\",\n \"function balanceOfNFT(uint256 tokenId) external view returns (uint256)\",\n \"function locked(uint256 tokenId) external view returns (uint256 amount, uint256 end)\",\n]);\n\nconst voterAbi = parseAbi([\n \"function vote(uint256 tokenId, address[] calldata pools, uint256[] calldata weights) external\",\n \"function claimBribes(address[] calldata bribes, address[][] calldata tokens, uint256 tokenId) external\",\n \"function claimFees(address[] calldata fees, address[][] calldata tokens, uint256 tokenId) external\",\n \"function gauges(address pool) external view returns (address)\",\n \"function gaugeForPool(address pool) external view returns (address)\",\n \"function poolToGauge(address pool) external view returns (address)\",\n]);\n\n// Multicall decode helpers\nconst _addressDecodeAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressDecodeAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\nconst _symbolDecodeAbi = parseAbi([\"function symbol() external view returns (string)\"]);\nfunction decodeSymbol(data: Hex | null): string {\n if (!data) return \"?\";\n try {\n return decodeFunctionResult({ abi: _symbolDecodeAbi, functionName: \"symbol\", data }) as string;\n } catch {\n return \"?\";\n }\n}\n\nconst _boolDecodeAbi = parseAbi([\"function f() external view returns (bool)\"]);\nfunction decodeBoolean(data: Hex): boolean {\n try {\n return decodeFunctionResult({ abi: _boolDecodeAbi, functionName: \"f\", data }) as boolean;\n } catch {\n return false;\n }\n}\n\n// HyperEVM well-known token addresses for CL pool discovery\nconst HYPEREVM_TOKENS: Record<string, Address> = {\n WHYPE: \"0x5555555555555555555555555555555555555555\",\n USDC: \"0xb88339CB7199b77E23DB6E890353E22632Ba630f\",\n USDT0: \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\",\n UETH: \"0xBe6727B535545C67d5cAa73dEa54865B92CF7907\",\n UBTC: \"0x9FDBdA0A5e284c32744D2f17Ee5c74B284993463\",\n USDH: \"0x111111a1a0667d36bD57c0A9f569b98057111111\",\n USDe: \"0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34\",\n sUSDe: \"0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2\",\n XAUt0: \"0xf4D9235269a96aaDaFc9aDAe454a0618eBE37949\",\n kHYPE: \"0xfD739d4e423301CE9385c1fb8850539D657C296D\",\n RAM: \"0x555570a286F15EbDFE42B66eDE2f724Aa1AB5555\",\n hyperRAM: \"0xAAAE8378809bb8815c08D3C59Eb0c7D1529aD769\",\n};\n\nconst CL_TICK_SPACINGS = [1, 5, 10, 50, 100, 200];\n\nexport class SolidlyGaugeAdapter implements IGaugeSystem {\n private readonly protocolName: string;\n private readonly voter: Address;\n private readonly veToken: Address;\n private readonly rpcUrl: string | undefined;\n private readonly clFactory: Address | undefined;\n private readonly v2Factory: Address | undefined;\n private readonly tokens: Address[] | undefined;\n // CL gauges (Aerodrome Slipstream / Velodrome CL) take an LP NFT via deposit(tokenId);\n // V2 gauges take an LP token amount via deposit(amount). Detect via uniswap_v3 + position_manager.\n private readonly clNftMode: boolean;\n private readonly positionManager: Address | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string, tokens?: Address[]) {\n this.protocolName = entry.name;\n const voter = entry.contracts?.[\"voter\"];\n if (!voter) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'voter' contract\");\n }\n const veToken = entry.contracts?.[\"ve_token\"];\n if (!veToken) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 've_token' contract\");\n }\n this.voter = voter;\n this.veToken = veToken;\n this.rpcUrl = rpcUrl;\n this.tokens = tokens;\n this.clFactory = entry.contracts?.[\"cl_factory\"] ?? entry.contracts?.[\"factory\"];\n this.v2Factory = entry.contracts?.[\"pair_factory\"] ?? entry.contracts?.[\"factory\"];\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.clNftMode = entry.interface === \"uniswap_v3\" && this.positionManager !== undefined;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n /** Scan V2 and CL factories for pools that have active emission gauges. */\n async discoverGaugedPools(): Promise<GaugedPool[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for gauge discovery\");\n\n const results: GaugedPool[] = [];\n\n await Promise.all([\n this._discoverV2GaugedPools(results),\n this._discoverCLGaugedPools(results),\n ]);\n\n // Batch query rewardRate + totalSupply + rewardToken for all gauges\n await this._enrichGaugeMetrics(results);\n\n return results;\n }\n\n /**\n * Batch query rewardRate, totalSupply, rewardToken for all discovered gauges.\n * Handles both single-token (rewardRate) and multi-token (rewardData) gauges.\n */\n private async _enrichGaugeMetrics(pools: GaugedPool[]): Promise<void> {\n if (!this.rpcUrl || pools.length === 0) return;\n\n const _u256Abi = parseAbi([\"function f() view returns (uint256)\"]);\n\n // Phase 1: batch rewardRate + totalSupply + rewardToken\n const calls: Array<[Address, Hex]> = [];\n for (const p of pools) {\n calls.push([p.gauge, encodeFunctionData({ abi: gaugeAbi, functionName: \"rewardRate\" })]);\n calls.push([p.gauge, encodeFunctionData({ abi: gaugeAbi, functionName: \"totalSupply\" })]);\n calls.push([p.gauge, encodeFunctionData({ abi: gaugeAbi, functionName: \"rewardToken\" })]);\n }\n\n const results = await multicallRead(this.rpcUrl, calls).catch(() => [] as (Hex | undefined)[]);\n\n for (let i = 0; i < pools.length; i++) {\n const base = i * 3;\n try {\n pools[i]!.rewardRate = results[base] ? decodeFunctionResult({ abi: _u256Abi, functionName: \"f\", data: results[base]! }) as bigint : 0n;\n } catch { pools[i]!.rewardRate = 0n; }\n try {\n pools[i]!.totalStaked = results[base + 1] ? decodeFunctionResult({ abi: _u256Abi, functionName: \"f\", data: results[base + 1]! }) as bigint : 0n;\n } catch { pools[i]!.totalStaked = 0n; }\n try {\n pools[i]!.rewardToken = results[base + 2] ? decodeAddress(results[base + 2]!) ?? undefined : undefined;\n } catch { /* skip */ }\n }\n\n // Phase 2: for gauges with rewardRate=0, try rewardData(token) with known reward tokens\n // These are multi-token gauges (e.g. Ramses uses xRAM/WHYPE)\n const KNOWN_REWARD_TOKENS: Address[] = [\n \"0x555570a286F15EbDFE42B66eDE2f724Aa1AB5555\" as Address, // xRAM\n \"0x5555555555555555555555555555555555555555\" as Address, // WHYPE\n \"0x067b0C72aa4C6Bd3BFEFfF443c536DCd6a25a9C8\" as Address, // HYBR\n \"0x07c57E32a3C29D5659bda1d3EFC2E7BF004E3035\" as Address, // NEST\n ];\n\n const needsFallback = pools.filter(p => (p.rewardRate ?? 0n) === 0n && (p.totalStaked ?? 0n) > 0n);\n if (needsFallback.length === 0) return;\n\n // Batch: rewardData(token) for each candidate token × each gauge\n const rdCalls: Array<[Address, Hex]> = [];\n const rdMeta: Array<{ poolIdx: number; token: Address }> = [];\n for (const p of needsFallback) {\n const poolIdx = pools.indexOf(p);\n for (const token of KNOWN_REWARD_TOKENS) {\n rdCalls.push([p.gauge, encodeFunctionData({ abi: gaugeAbi, functionName: \"rewardData\", args: [token] })]);\n rdMeta.push({ poolIdx, token });\n }\n }\n\n const rdResults = await multicallRead(this.rpcUrl, rdCalls).catch(() => [] as (Hex | undefined)[]);\n\n // rewardData returns (uint256 periodFinish, uint256 rewardRate, uint256 lastUpdateTime, uint256 rewardPerTokenStored)\n const _rdAbi = parseAbi([\"function f() view returns (uint256, uint256, uint256, uint256)\"]);\n for (let i = 0; i < rdMeta.length; i++) {\n const { poolIdx, token } = rdMeta[i]!;\n const pool = pools[poolIdx]!;\n // Skip if already found a reward rate for this pool\n if ((pool.rewardRate ?? 0n) > 0n) continue;\n try {\n if (!rdResults[i]) continue;\n const decoded = decodeFunctionResult({ abi: _rdAbi, functionName: \"f\", data: rdResults[i]! }) as [bigint, bigint, bigint, bigint];\n const [periodFinish, rewardRate] = decoded;\n const now = BigInt(Math.floor(Date.now() / 1000));\n if (rewardRate > 0n && periodFinish > now) {\n pool.rewardRate = rewardRate;\n pool.rewardToken = token;\n }\n } catch { /* skip */ }\n }\n }\n\n private async _discoverV2GaugedPools(out: GaugedPool[]): Promise<void> {\n if (!this.rpcUrl || !this.v2Factory) return;\n\n const pairAbi = parseAbi([\n \"function token0() external view returns (address)\",\n \"function token1() external view returns (address)\",\n \"function stable() external view returns (bool)\",\n ]);\n const erc20SymbolAbi = parseAbi([\"function symbol() external view returns (string)\"]);\n const voterLengthAbi = parseAbi([\"function length() external view returns (uint256)\"]);\n const voterPoolsAbi = parseAbi([\"function pools(uint256) external view returns (address)\"]);\n const gaugeForPoolAbi = parseAbi([\"function gaugeForPool(address) external view returns (address)\"]);\n const poolToGaugeAbi = parseAbi([\"function poolToGauge(address) external view returns (address)\"]);\n const gaugesAbi = parseAbi([\"function gauges(address) external view returns (address)\"]);\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // Strategy: prefer voter.pools() list (only gauged pools) over factory scan\n let pairs: Address[] = [];\n let voterPoolCount = 0;\n\n // Try voter.length() + voter.pools(i) — returns only pools with gauges\n try {\n const len = await client.readContract({ address: this.voter, abi: voterLengthAbi, functionName: \"length\" }) as bigint;\n voterPoolCount = Number(len);\n } catch { /* voter.length() not supported — fall back to factory scan */ }\n\n if (voterPoolCount > 0) {\n // Scan voter's pool list (max 500 most recent)\n const MAX_SCAN = 500;\n const startIdx = Math.max(0, voterPoolCount - MAX_SCAN);\n const poolCalls: Array<[Address, Hex]> = [];\n for (let i = startIdx; i < voterPoolCount; i++) {\n poolCalls.push([this.voter, encodeFunctionData({ abi: voterPoolsAbi, functionName: \"pools\", args: [BigInt(i)] })]);\n }\n const poolResults = await multicallRead(this.rpcUrl, poolCalls);\n pairs = poolResults.map(r => decodeAddress(r)).filter((a): a is Address => a !== null && a !== zeroAddress);\n } else {\n // Fallback: factory scan (for voters without length/pools)\n const v2FactoryAbi = parseAbi([\"function allPairsLength() view returns (uint256)\", \"function allPairs(uint256) view returns (address)\"]);\n const solidlyFactoryAbi = parseAbi([\"function allPoolsLength() view returns (uint256)\", \"function allPools(uint256) view returns (address)\"]);\n let pairCount = 0n;\n let useSolidly = false;\n try { pairCount = await client.readContract({ address: this.v2Factory, abi: v2FactoryAbi, functionName: \"allPairsLength\" }) as bigint; }\n catch { try { pairCount = await client.readContract({ address: this.v2Factory, abi: solidlyFactoryAbi, functionName: \"allPoolsLength\" }) as bigint; useSolidly = true; } catch { return; } }\n const count = Number(pairCount);\n if (count === 0) return;\n const MAX_SCAN = 500;\n const startIdx = Math.max(0, count - MAX_SCAN);\n const fetchAbi = useSolidly ? solidlyFactoryAbi : v2FactoryAbi;\n const fetchFn = useSolidly ? \"allPools\" as const : \"allPairs\" as const;\n const pairCalls: Array<[Address, Hex]> = [];\n for (let i = startIdx; i < count; i++) pairCalls.push([this.v2Factory, encodeFunctionData({ abi: fetchAbi, functionName: fetchFn, args: [BigInt(i)] })]);\n const pairResults = await multicallRead(this.rpcUrl, pairCalls);\n pairs = pairResults.map(r => decodeAddress(r)).filter((a): a is Address => a !== null && a !== zeroAddress);\n }\n\n if (pairs.length === 0) return;\n\n // Resolve gauges: try gaugeForPool → poolToGauge → gauges (Aerodrome/Velodrome)\n const gaugeCalls: Array<[Address, Hex]> = pairs.map(p => [this.voter, encodeFunctionData({ abi: gaugeForPoolAbi, functionName: \"gaugeForPool\", args: [p] })]);\n let gaugeResults = await multicallRead(this.rpcUrl, gaugeCalls);\n\n const allNull = gaugeResults.every(r => !r || decodeAddress(r) === zeroAddress || decodeAddress(r) === null);\n if (allNull) {\n const fb1: Array<[Address, Hex]> = pairs.map(p => [this.voter, encodeFunctionData({ abi: poolToGaugeAbi, functionName: \"poolToGauge\", args: [p] })]);\n gaugeResults = await multicallRead(this.rpcUrl, fb1);\n }\n const allNull2 = gaugeResults.every(r => !r || decodeAddress(r) === zeroAddress || decodeAddress(r) === null);\n if (allNull2) {\n const fb2: Array<[Address, Hex]> = pairs.map(p => [this.voter, encodeFunctionData({ abi: gaugesAbi, functionName: \"gauges\", args: [p] })]);\n gaugeResults = await multicallRead(this.rpcUrl, fb2);\n }\n\n // Filter only pairs that have a gauge\n const gaugedPairs: Array<{ pair: Address; gauge: Address }> = [];\n for (let i = 0; i < pairs.length; i++) {\n const gauge = decodeAddress(gaugeResults[i] ?? null);\n if (gauge && gauge !== zeroAddress) {\n gaugedPairs.push({ pair: pairs[i]!, gauge });\n }\n }\n\n if (gaugedPairs.length === 0) return;\n\n // Step 4: fetch token0, token1, stable for each gauged pair\n const metaCalls: Array<[Address, Hex]> = [];\n for (const { pair } of gaugedPairs) {\n metaCalls.push([pair, encodeFunctionData({ abi: pairAbi, functionName: \"token0\" })]);\n metaCalls.push([pair, encodeFunctionData({ abi: pairAbi, functionName: \"token1\" })]);\n metaCalls.push([pair, encodeFunctionData({ abi: pairAbi, functionName: \"stable\" })]);\n }\n const metaResults = await multicallRead(this.rpcUrl, metaCalls);\n\n // Step 5: collect unique token addresses and fetch symbols\n const tokenAddrs = new Set<Address>();\n for (let i = 0; i < gaugedPairs.length; i++) {\n const t0 = decodeAddress(metaResults[i * 3] ?? null);\n const t1 = decodeAddress(metaResults[i * 3 + 1] ?? null);\n if (t0 && t0 !== zeroAddress) tokenAddrs.add(t0);\n if (t1 && t1 !== zeroAddress) tokenAddrs.add(t1);\n }\n\n const uniqueTokens = Array.from(tokenAddrs);\n const symbolCalls: Array<[Address, Hex]> = uniqueTokens.map((t) => [\n t,\n encodeFunctionData({ abi: erc20SymbolAbi, functionName: \"symbol\" }),\n ]);\n const symbolResults = await multicallRead(this.rpcUrl, symbolCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeSymbol(symbolResults[i] ?? null));\n }\n\n // Step 6: assemble results\n for (let i = 0; i < gaugedPairs.length; i++) {\n const { pair, gauge } = gaugedPairs[i]!;\n const t0 = decodeAddress(metaResults[i * 3] ?? null);\n const t1 = decodeAddress(metaResults[i * 3 + 1] ?? null);\n const stableRaw = metaResults[i * 3 + 2];\n const stable = stableRaw ? decodeBoolean(stableRaw) : false;\n out.push({\n pool: pair,\n gauge,\n token0: t0 ? (symbolMap.get(t0) ?? t0.slice(0, 10)) : \"?\",\n token1: t1 ? (symbolMap.get(t1) ?? t1.slice(0, 10)) : \"?\",\n token0Addr: t0 ?? undefined,\n token1Addr: t1 ?? undefined,\n type: \"V2\",\n stable,\n });\n }\n }\n\n private async _discoverCLGaugedPools(out: GaugedPool[]): Promise<void> {\n if (!this.rpcUrl || !this.clFactory) return;\n\n const clFactoryAbi = parseAbi([\n \"function getPool(address tokenA, address tokenB, int24 tickSpacing) external view returns (address pool)\",\n ]);\n const algebraFactoryAbi = parseAbi([\n \"function poolByPair(address tokenA, address tokenB) external view returns (address pool)\",\n ]);\n const poolAbi = parseAbi([\n \"function token0() external view returns (address)\",\n \"function token1() external view returns (address)\",\n ]);\n const erc20SymbolAbi = parseAbi([\"function symbol() external view returns (string)\"]);\n const gaugeForPoolAbi = parseAbi([\"function gaugeForPool(address) external view returns (address)\"]);\n const poolToGaugeAbi = parseAbi([\"function poolToGauge(address) external view returns (address)\"]);\n\n const tokenAddresses = this.tokens ?? Object.values(HYPEREVM_TOKENS);\n\n // Generate all unique token pairs\n const pairs: Array<[Address, Address]> = [];\n for (let i = 0; i < tokenAddresses.length; i++) {\n for (let j = i + 1; j < tokenAddresses.length; j++) {\n pairs.push([tokenAddresses[i]!, tokenAddresses[j]!]);\n }\n }\n\n // Detect factory type: try poolByPair (Algebra) — if it returns non-null, it's Algebra\n const isAlgebra = await (async () => {\n try {\n const [result] = await multicallRead(this.rpcUrl!, [[\n this.clFactory!,\n encodeFunctionData({ abi: algebraFactoryAbi, functionName: \"poolByPair\", args: [tokenAddresses[0]!, tokenAddresses[1]!] }),\n ]]);\n // If poolByPair returns any data (even zero address), it's Algebra\n return result !== null && result.length >= 66;\n } catch {\n return false;\n }\n })();\n\n // Build pool lookup calls\n const getPoolCalls: Array<[Address, Hex]> = [];\n const callMeta: Array<{ pairIdx: number; tickSpacing: number }> = [];\n\n if (isAlgebra) {\n // Algebra: one pool per pair (no tickSpacing)\n for (let p = 0; p < pairs.length; p++) {\n const [tokenA, tokenB] = pairs[p]!;\n getPoolCalls.push([\n this.clFactory!,\n encodeFunctionData({ abi: algebraFactoryAbi, functionName: \"poolByPair\", args: [tokenA!, tokenB!] }),\n ]);\n callMeta.push({ pairIdx: p, tickSpacing: 0 });\n }\n } else {\n // Uniswap-style: multiple tick spacings per pair\n for (let p = 0; p < pairs.length; p++) {\n const [tokenA, tokenB] = pairs[p]!;\n for (const ts of CL_TICK_SPACINGS) {\n getPoolCalls.push([\n this.clFactory!,\n encodeFunctionData({ abi: clFactoryAbi, functionName: \"getPool\", args: [tokenA!, tokenB!, ts] }),\n ]);\n callMeta.push({ pairIdx: p, tickSpacing: ts });\n }\n }\n }\n\n const getPoolResults = await multicallRead(this.rpcUrl, getPoolCalls);\n\n // Collect non-zero pool addresses\n const candidatePools: Array<{ pool: Address; tokenA: Address; tokenB: Address; tickSpacing: number }> = [];\n for (let i = 0; i < getPoolCalls.length; i++) {\n const pool = decodeAddress(getPoolResults[i] ?? null);\n if (pool && pool !== zeroAddress) {\n const { pairIdx, tickSpacing } = callMeta[i]!;\n const [tokenA, tokenB] = pairs[pairIdx]!;\n candidatePools.push({ pool, tokenA: tokenA!, tokenB: tokenB!, tickSpacing });\n }\n }\n\n if (candidatePools.length === 0) return;\n\n // Batch gauge lookup — try gaugeForPool first, fallback to poolToGauge\n const gaugeCalls: Array<[Address, Hex]> = candidatePools.map(({ pool }) => [\n this.voter,\n encodeFunctionData({ abi: gaugeForPoolAbi, functionName: \"gaugeForPool\", args: [pool] }),\n ]);\n let gaugeResults = await multicallRead(this.rpcUrl, gaugeCalls);\n\n // If all results are null (gaugeForPool not supported), try poolToGauge\n const allNull = gaugeResults.every(r => !r || decodeAddress(r) === zeroAddress || decodeAddress(r) === null);\n if (allNull) {\n const fallbackCalls: Array<[Address, Hex]> = candidatePools.map(({ pool }) => [\n this.voter,\n encodeFunctionData({ abi: poolToGaugeAbi, functionName: \"poolToGauge\", args: [pool] }),\n ]);\n gaugeResults = await multicallRead(this.rpcUrl, fallbackCalls);\n }\n\n // Filter to pools that have a gauge\n const gaugedCL: Array<{ pool: Address; gauge: Address; tokenA: Address; tokenB: Address; tickSpacing: number }> = [];\n for (let i = 0; i < candidatePools.length; i++) {\n const gauge = decodeAddress(gaugeResults[i] ?? null);\n if (gauge && gauge !== zeroAddress) {\n gaugedCL.push({ ...candidatePools[i]!, gauge });\n }\n }\n\n if (gaugedCL.length === 0) return;\n\n // Fetch token0/token1 from pool to get correct ordering, then symbols\n const tokenAddrsInPools = new Set<Address>();\n for (const { tokenA, tokenB } of gaugedCL) {\n tokenAddrsInPools.add(tokenA);\n tokenAddrsInPools.add(tokenB);\n }\n const uniqueTokens = Array.from(tokenAddrsInPools);\n const symbolCalls: Array<[Address, Hex]> = uniqueTokens.map((t) => [\n t,\n encodeFunctionData({ abi: erc20SymbolAbi, functionName: \"symbol\" }),\n ]);\n const symbolResults = await multicallRead(this.rpcUrl, symbolCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeSymbol(symbolResults[i] ?? null));\n }\n\n // Also try to read actual token0/token1 ordering from the pool contract\n const poolTokenCalls: Array<[Address, Hex]> = [];\n for (const { pool } of gaugedCL) {\n poolTokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token0\" })]);\n poolTokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token1\" })]);\n }\n const poolTokenResults = await multicallRead(this.rpcUrl, poolTokenCalls);\n\n for (let i = 0; i < gaugedCL.length; i++) {\n const { pool, gauge, tokenA, tokenB, tickSpacing } = gaugedCL[i]!;\n const rawT0 = decodeAddress(poolTokenResults[i * 2] ?? null);\n const rawT1 = decodeAddress(poolTokenResults[i * 2 + 1] ?? null);\n const t0 = rawT0 && rawT0 !== zeroAddress ? rawT0 : tokenA;\n const t1 = rawT1 && rawT1 !== zeroAddress ? rawT1 : tokenB;\n out.push({\n pool,\n gauge,\n token0: symbolMap.get(t0) ?? t0.slice(0, 10),\n token1: symbolMap.get(t1) ?? t1.slice(0, 10),\n token0Addr: t0,\n token1Addr: t1,\n type: \"CL\",\n tickSpacing,\n });\n }\n }\n\n // IGauge\n\n async buildDeposit(gauge: Address, amount: bigint, tokenId?: bigint, lpToken?: Address): Promise<DeFiTx> {\n // CL gauge (Aerodrome Slipstream / Velodrome CL): NFT-based deposit(tokenId) + NFT.approve pre-tx\n if (this.clNftMode && tokenId !== undefined && this.positionManager) {\n const nftAbi = parseAbi([\"function approve(address to, uint256 tokenId) external\"]);\n const clGaugeAbi = parseAbi([\"function deposit(uint256 tokenId) external\"]);\n const approveTx: DeFiTx = {\n description: `[${this.protocolName}] Approve LP NFT #${tokenId} to gauge`,\n to: this.positionManager,\n data: encodeFunctionData({ abi: nftAbi, functionName: \"approve\", args: [gauge, tokenId] }),\n value: 0n,\n gas_estimate: 80_000,\n };\n return {\n description: `[${this.protocolName}] Deposit LP NFT #${tokenId} to CL gauge`,\n to: gauge,\n data: encodeFunctionData({ abi: clGaugeAbi, functionName: \"deposit\", args: [tokenId] }),\n value: 0n,\n gas_estimate: 900_000,\n pre_txs: [approveTx],\n };\n }\n if (tokenId !== undefined) {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"depositFor\",\n args: [amount, tokenId],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to gauge (boost veNFT #${tokenId})`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: lpToken ? [{ token: lpToken, spender: gauge, amount }] : undefined,\n };\n }\n\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"deposit\",\n args: [amount],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to gauge`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: lpToken ? [{ token: lpToken, spender: gauge, amount }] : undefined,\n };\n }\n\n async buildWithdraw(gauge: Address, amount: bigint, tokenId?: bigint): Promise<DeFiTx> {\n // CL gauge: withdraw(tokenId) returns the LP NFT to the user\n if (this.clNftMode && tokenId !== undefined) {\n const clGaugeAbi = parseAbi([\"function withdraw(uint256 tokenId) external\"]);\n return {\n description: `[${this.protocolName}] Withdraw LP NFT #${tokenId} from CL gauge`,\n to: gauge,\n data: encodeFunctionData({ abi: clGaugeAbi, functionName: \"withdraw\", args: [tokenId] }),\n value: 0n,\n gas_estimate: 600_000,\n };\n }\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"withdraw\",\n args: [amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from gauge`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Resolve gauge address from a pool address via voter contract.\n * Tries gaugeForPool (Ramses), poolToGauge (NEST), gauges (classic Solidly).\n */\n async resolveGauge(pool: Address): Promise<Address> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for gauge lookup\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n for (const fn of [\"gaugeForPool\", \"poolToGauge\", \"gauges\"] as const) {\n try {\n const gauge = await client.readContract({\n address: this.voter,\n abi: voterAbi,\n functionName: fn,\n args: [pool],\n }) as Address;\n if (gauge !== zeroAddress) return gauge;\n } catch {\n // try next\n }\n }\n throw new DefiError(\"CONTRACT_ERROR\", `[${this.protocolName}] No gauge found for pool ${pool}`);\n }\n\n /**\n * Discover reward tokens for a gauge.\n * Returns { tokens, multiToken } where multiToken indicates getReward(account, tokens[]) support.\n */\n private async discoverRewardTokens(gauge: Address): Promise<{ tokens: Address[]; multiToken: boolean }> {\n if (!this.rpcUrl) return { tokens: [], multiToken: false };\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // 1. Try rewardsListLength — multi-token gauges (Ramses style)\n try {\n const len = await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"rewardsListLength\",\n }) as bigint;\n\n if (Number(len) > 0) {\n // Discover via rewardData for known HyperEVM tokens\n const candidates: Address[] = [\n \"0x5555555555555555555555555555555555555555\", // WHYPE\n \"0x555570a286F15EbDFE42B66eDE2f724Aa1AB5555\", // xRAM\n \"0x067b0C72aa4C6Bd3BFEFfF443c536DCd6a25a9C8\", // HYBR\n \"0x07c57E32a3C29D5659bda1d3EFC2E7BF004E3035\", // NEST token\n ];\n const found: Address[] = [];\n for (const token of candidates) {\n try {\n const rd = await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"rewardData\",\n args: [token],\n }) as readonly [bigint, bigint, bigint, bigint];\n if (rd[0] > 0n || rd[1] > 0n) found.push(token);\n } catch { /* not a reward */ }\n }\n if (found.length > 0) return { tokens: found, multiToken: true };\n return { tokens: [], multiToken: true }; // has rewards but couldn't enumerate\n }\n } catch {\n // no rewardsListLength\n }\n\n // 2. Fallback: rewardToken() — single-reward gauges (NEST / Hybra style)\n try {\n const rt = await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"rewardToken\",\n }) as Address;\n if (rt !== zeroAddress) return { tokens: [rt], multiToken: false };\n } catch { /* no rewardToken */ }\n\n return { tokens: [], multiToken: false };\n }\n\n async buildClaimRewards(gauge: Address, account?: Address): Promise<DeFiTx> {\n if (!this.rpcUrl || !account) {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [account ?? zeroAddress],\n });\n return { description: `[${this.protocolName}] Claim gauge rewards`, to: gauge, data, value: 0n, gas_estimate: 200_000 };\n }\n\n const { tokens, multiToken } = await this.discoverRewardTokens(gauge);\n\n // Multi-token gauge (Ramses): getReward(account, tokens[])\n if (multiToken && tokens.length > 0) {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [account, tokens],\n });\n return {\n description: `[${this.protocolName}] Claim gauge rewards (${tokens.length} tokens)`,\n to: gauge, data, value: 0n, gas_estimate: 300_000,\n };\n }\n\n // Single-token gauge: try getReward(account) first (Aerodrome / Velodrome / standard Solidly v2),\n // fall back to no-arg getReward() if that simulates as revert (NEST-style).\n const accountVariant = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [account],\n });\n try {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n await client.call({ account, to: gauge, data: accountVariant });\n return {\n description: `[${this.protocolName}] Claim gauge rewards (getReward(account))`,\n to: gauge, data: accountVariant, value: 0n, gas_estimate: 200_000,\n };\n } catch {\n const noArg = encodeFunctionData({ abi: gaugeAbi, functionName: \"getReward\", args: [] });\n return {\n description: `[${this.protocolName}] Claim gauge rewards (getReward())`,\n to: gauge, data: noArg, value: 0n, gas_estimate: 200_000,\n };\n }\n }\n\n /**\n * Claim rewards for a CL gauge by NFT tokenId (Hybra V4 style — single-arg getReward(tokenId)).\n */\n async buildClaimRewardsByTokenId(gauge: Address, tokenId: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim gauge rewards for NFT #${tokenId}`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n /**\n * Ramses-CL claim via NPM.getPeriodReward — the user-facing claim path.\n * The gauge contract restricts `getReward*` to authorized claimers (voter + NPM only);\n * EOAs must route through NPM, which calls into the gauge with msg.sender = NPM.\n *\n * ABI: getPeriodReward(uint256 period, uint256 tokenId, address[] tokens, address receiver)\n * `period` defaults to current Solidly weekly epoch index (block.timestamp / 604800).\n * `tokens` defaults to gauge.getRewardTokens() when `gauge` is provided.\n *\n * Verified 2026-04-29 on anvil fork: NPM.getPeriodReward(2938, 177068, [..., xRAM], wallet)\n * delivered 71.11 xRAM after 1h emission warp; direct gauge.getReward(...) reverts\n * with NOT_AUTHORIZED_CLAIMER for the same EOA.\n */\n async buildClaimRewardsViaNPMPeriodReward(\n npm: Address,\n tokenId: bigint,\n receiver: Address,\n opts?: { tokens?: Address[]; gauge?: Address; period?: bigint },\n ): Promise<DeFiTx> {\n let rewardTokens = opts?.tokens;\n if (!rewardTokens || rewardTokens.length === 0) {\n if (!opts?.gauge) {\n throw DefiError.invalidParam(\n \"Ramses CL claim requires either `tokens` or `gauge` (for getRewardTokens lookup)\",\n );\n }\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required to discover reward tokens\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n try {\n rewardTokens = await client.readContract({\n address: opts.gauge, abi: gaugeAbi, functionName: \"getRewardTokens\",\n }) as Address[];\n } catch {\n throw DefiError.contractError(\n `[${this.protocolName}] gauge.getRewardTokens() reverted — pass tokens[] explicitly`,\n );\n }\n }\n if (rewardTokens.length === 0) {\n throw DefiError.contractError(`[${this.protocolName}] no reward tokens to claim`);\n }\n const epochSeconds = 604800n;\n const period = opts?.period ?? (BigInt(Math.floor(Date.now() / 1000)) / epochSeconds);\n\n const npmClaimAbi = parseAbi([\n \"function getPeriodReward(uint256 period, uint256 tokenId, address[] tokens, address receiver) external\",\n ]);\n const data = encodeFunctionData({\n abi: npmClaimAbi,\n functionName: \"getPeriodReward\",\n args: [period, tokenId, rewardTokens, receiver],\n });\n return {\n description: `[${this.protocolName}] Claim via NPM.getPeriodReward(period=${period}, tokenId=${tokenId}, ${rewardTokens.length} tokens)`,\n to: npm,\n data,\n value: 0n,\n gas_estimate: 600_000,\n };\n }\n\n /**\n * @deprecated Direct gauge.getReward(tokenId, tokens[]) reverts with NOT_AUTHORIZED_CLAIMER\n * for EOAs on Ramses CL. Use buildClaimRewardsViaNPMPeriodReward instead.\n */\n async buildClaimRewardsByCLTokenIdMulti(\n gauge: Address,\n tokenId: bigint,\n tokens?: Address[],\n ): Promise<DeFiTx> {\n let rewardTokens = tokens;\n if (!rewardTokens || rewardTokens.length === 0) {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required to discover reward tokens\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n try {\n rewardTokens = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"getRewardTokens\",\n }) as Address[];\n } catch {\n throw DefiError.contractError(\n `[${this.protocolName}] gauge.getRewardTokens() reverted — pass tokens[] explicitly`,\n );\n }\n }\n if (rewardTokens.length === 0) {\n throw DefiError.contractError(`[${this.protocolName}] no reward tokens to claim`);\n }\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [tokenId, rewardTokens],\n });\n return {\n description: `[${this.protocolName}] Claim CL gauge rewards for NFT #${tokenId} (${rewardTokens.length} tokens)`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n /**\n * Ramses-CL-style pending rewards: earned(token, tokenId) per reward token from\n * gauge.getRewardTokens(). Returns raw amounts; caller resolves USD value.\n */\n async getPendingRewardsByCLTokenIdMulti(\n gauge: Address,\n tokenId: bigint,\n ): Promise<RewardInfo[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n let rewardTokens: Address[];\n try {\n rewardTokens = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"getRewardTokens\",\n }) as Address[];\n } catch {\n return [];\n }\n const out: RewardInfo[] = [];\n for (const token of rewardTokens) {\n try {\n const amount = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [token, tokenId],\n }) as bigint;\n out.push({ token, symbol: token.slice(0, 10), amount });\n } catch { /* skip token-tokenId pair that reverts */ }\n }\n return out;\n }\n\n async getPendingRewards(gauge: Address, user: Address): Promise<RewardInfo[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const results: RewardInfo[] = [];\n\n const { tokens, multiToken } = await this.discoverRewardTokens(gauge);\n\n if (multiToken && tokens.length > 0) {\n for (const token of tokens) {\n try {\n const earned = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [token, user],\n }) as bigint;\n results.push({ token, symbol: token.slice(0, 10), amount: earned });\n } catch { /* skip */ }\n }\n } else if (tokens.length > 0) {\n // Single-token gauge: earned(account)\n try {\n const earned = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [user],\n }) as bigint;\n results.push({ token: tokens[0]!, symbol: tokens[0]!.slice(0, 10), amount: earned });\n } catch { /* skip */ }\n } else {\n try {\n const earned = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [user],\n }) as bigint;\n results.push({ token: zeroAddress as Address, symbol: \"unknown\", amount: earned });\n } catch { /* skip */ }\n }\n\n return results;\n }\n\n /**\n * Get pending rewards for a CL gauge NFT position (Hybra V4 style).\n */\n async getPendingRewardsByTokenId(gauge: Address, tokenId: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"earned\",\n args: [tokenId],\n }) as bigint;\n }\n\n /**\n * Get pending rewards for an Aerodrome Slipstream CL gauge NFT position.\n * Uses the earned(address account, uint256 tokenId) overload, which is required\n * for CL gauges — the single-param earned(address) reverts on these contracts.\n */\n async getPendingRewardsByCLTokenId(gauge: Address, user: Address, tokenId: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"earned\",\n args: [user, tokenId],\n }) as bigint;\n }\n\n // IVoteEscrow\n\n async buildCreateLock(amount: bigint, lockDuration: number): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"create_lock\",\n args: [amount, BigInt(lockDuration)],\n });\n return {\n description: `[${this.protocolName}] Create veNFT lock: ${amount} tokens for ${lockDuration}s`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildIncreaseAmount(tokenId: bigint, amount: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"increase_amount\",\n args: [tokenId, amount],\n });\n return {\n description: `[${this.protocolName}] Increase veNFT #${tokenId} by ${amount}`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildIncreaseUnlockTime(tokenId: bigint, lockDuration: number): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"increase_unlock_time\",\n args: [tokenId, BigInt(lockDuration)],\n });\n return {\n description: `[${this.protocolName}] Extend veNFT #${tokenId} lock by ${lockDuration}s`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildWithdrawExpired(tokenId: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"withdraw\",\n args: [tokenId],\n });\n return {\n description: `[${this.protocolName}] Withdraw expired veNFT #${tokenId}`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n // IVoter\n\n async buildVote(tokenId: bigint, pools: Address[], weights: bigint[]): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"vote\",\n args: [tokenId, pools, weights],\n });\n return {\n description: `[${this.protocolName}] Vote with veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 500_000,\n };\n }\n\n async buildClaimBribes(bribes: Address[], tokenId: bigint): Promise<DeFiTx> {\n // claimBribes needs token arrays per bribe contract — simplified version\n const tokensPerBribe: Address[][] = bribes.map(() => []);\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"claimBribes\",\n args: [bribes, tokensPerBribe, tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim bribes for veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildClaimFees(fees: Address[], tokenId: bigint): Promise<DeFiTx> {\n const tokensPerFee: Address[][] = fees.map(() => []);\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"claimFees\",\n args: [fees, tokensPerFee, tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim trading fees for veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IGauge,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst masterchefAbi = parseAbi([\n \"function deposit(uint256 pid, uint256 amount) external\",\n \"function withdraw(uint256 pid, uint256 amount) external\",\n \"function claim(uint256[] calldata pids) external\",\n \"function pendingRewards(address account, uint256[] calldata pids) view returns (uint256[] memory moeRewards)\",\n \"function getNumberOfFarms() view returns (uint256)\",\n \"function getPidByPool(address pool) view returns (uint256)\",\n]);\n\nexport class MasterChefAdapter implements IGauge {\n private readonly protocolName: string;\n private readonly masterchef: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const masterchef = entry.contracts?.[\"masterchef\"];\n if (!masterchef) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'masterchef' contract\");\n }\n this.masterchef = masterchef;\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n /**\n * Deposit LP tokens into a MasterChef farm.\n * `gauge` is the pool address (unused for calldata — MasterChef is the target).\n * `tokenId` carries the farm pid.\n */\n async buildDeposit(gauge: Address, amount: bigint, tokenId?: bigint): Promise<DeFiTx> {\n const pid = tokenId ?? 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"deposit\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Withdraw LP tokens from a MasterChef farm.\n * `gauge` is used to look up the pid description only; call site should pass pid via tokenId\n * on the deposit flow. Here pid defaults to 0 — callers should encode the pid in the gauge\n * address slot or wrap this adapter with a pid-aware helper.\n */\n async buildWithdraw(gauge: Address, amount: bigint): Promise<DeFiTx> {\n // IGauge interface does not carry tokenId on withdraw; default pid=0.\n // Callers that need a specific pid should call buildWithdrawPid directly.\n const pid = 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"withdraw\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Withdraw LP tokens specifying a pid explicitly (MasterChef extension beyond IGauge). */\n async buildWithdrawPid(pid: bigint, amount: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"withdraw\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from farm pid=${pid}`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Claim pending MOE rewards. IGauge interface provides no pid — defaults to pid=0. */\n async buildClaimRewards(gauge: Address): Promise<DeFiTx> {\n const pid = 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"claim\",\n args: [[pid]],\n });\n return {\n description: `[${this.protocolName}] Claim MOE rewards for farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Claim pending MOE rewards for a specific pid (MasterChef extension beyond IGauge). */\n async buildClaimRewardsPid(pid: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"claim\",\n args: [[pid]],\n });\n return {\n description: `[${this.protocolName}] Claim MOE rewards for farm pid=${pid}`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Get pending MOE rewards for a user. Requires rpcUrl. */\n async getPendingRewards(_gauge: Address, user: Address): Promise<RewardInfo[]> {\n if (!this.rpcUrl) {\n throw DefiError.unsupported(`[${this.protocolName}] getPendingRewards requires RPC`);\n }\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const rewards = await client.readContract({\n address: this.masterchef,\n abi: masterchefAbi,\n functionName: \"pendingRewards\",\n args: [user, [0n]],\n });\n return (rewards as bigint[]).map((amount) => ({\n token: this.masterchef,\n symbol: \"MOE\",\n amount,\n }));\n }\n}\n","import {\n encodeFunctionData,\n decodeFunctionResult,\n parseAbi,\n createPublicClient,\n http,\n} from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type { ProtocolEntry, DeFiTx, RewardInfo } from \"@hypurrquant/defi-core\";\n\n// ============================================================\n// ABIs\n// ============================================================\n\nconst lbRouterAbi = parseAbi([\n \"struct LiquidityParameters { address tokenX; address tokenY; uint256 binStep; uint256 amountX; uint256 amountY; uint256 amountXMin; uint256 amountYMin; uint256 activeIdDesired; uint256 idSlippage; int256[] deltaIds; uint256[] distributionX; uint256[] distributionY; address to; address refundTo; uint256 deadline; }\",\n \"function addLiquidity(LiquidityParameters calldata liquidityParameters) external returns (uint256 amountXAdded, uint256 amountYAdded, uint256 amountXLeft, uint256 amountYLeft, uint256[] memory depositIds, uint256[] memory liquidityMinted)\",\n \"function removeLiquidity(address tokenX, address tokenY, uint16 binStep, uint256 amountXMin, uint256 amountYMin, uint256[] memory ids, uint256[] memory amounts, address to, uint256 deadline) external returns (uint256 amountX, uint256 amountY)\",\n]);\n\nconst lbFactoryAbi = parseAbi([\n \"function getNumberOfLBPairs() external view returns (uint256)\",\n \"function getLBPairAtIndex(uint256 index) external view returns (address)\",\n]);\n\nconst lbPairAbi = parseAbi([\n \"function getLBHooksParameters() external view returns (bytes32)\",\n \"function getActiveId() external view returns (uint24)\",\n \"function getBinStep() external view returns (uint16)\",\n \"function getTokenX() external view returns (address)\",\n \"function getTokenY() external view returns (address)\",\n \"function balanceOf(address account, uint256 id) external view returns (uint256)\",\n \"function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory)\",\n]);\n\nconst lbRewarderAbi = parseAbi([\n \"function getRewardToken() external view returns (address)\",\n \"function getRewardedRange() external view returns (uint256 minBinId, uint256 maxBinId)\",\n \"function getPendingRewards(address user, uint256[] calldata ids) external view returns (uint256 pendingRewards)\",\n \"function claim(address user, uint256[] calldata ids) external\",\n \"function getPid() external view returns (uint256)\",\n \"function isStopped() external view returns (bool)\",\n \"function getLBPair() external view returns (address)\",\n \"function getMasterChef() external view returns (address)\",\n]);\n\nconst masterChefAbi = parseAbi([\n \"function getMoePerSecond() external view returns (uint256)\",\n \"function getTreasuryShare() external view returns (uint256)\",\n \"function getStaticShare() external view returns (uint256)\",\n \"function getVeMoe() external view returns (address)\",\n]);\n\nconst veMoeAbi = parseAbi([\n \"function getWeight(uint256 pid) external view returns (uint256)\",\n \"function getTotalWeight() external view returns (uint256)\",\n \"function getTopPoolIds() external view returns (uint256[] memory)\",\n]);\n\nconst lbPairBinAbi = parseAbi([\n \"function getBin(uint24 id) external view returns (uint128 reserveX, uint128 reserveY)\",\n \"function getActiveId() external view returns (uint24)\",\n]);\n\nconst lbQuoterAbi = parseAbi([\n \"function findBestPathFromAmountIn(address[] calldata route, uint128 amountIn) external view returns ((address[] route, address[] pairs, uint256[] binSteps, uint256[] versions, uint128[] amounts, uint128[] virtualAmountsWithoutSlippage, uint128[] fees))\",\n]);\n\nconst erc20Abi = parseAbi([\n \"function symbol() external view returns (string)\",\n \"function balanceOf(address account) external view returns (uint256)\",\n]);\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface LBAddLiquidityParams {\n pool: Address;\n tokenX: Address;\n tokenY: Address;\n binStep: number;\n amountX: bigint;\n amountY: bigint;\n /** Number of bins on each side of active bin to distribute across (default: 5) */\n numBins?: number;\n /** Active bin id desired (defaults to on-chain query if rpcUrl provided) */\n activeIdDesired?: number;\n recipient: Address;\n deadline?: bigint;\n}\n\nexport interface LBRemoveLiquidityParams {\n tokenX: Address;\n tokenY: Address;\n binStep: number;\n binIds: number[];\n /** Amount of LB tokens to remove per bin (in order matching binIds) */\n amounts: bigint[];\n amountXMin?: bigint;\n amountYMin?: bigint;\n recipient: Address;\n deadline?: bigint;\n}\n\nexport interface LBPosition {\n binId: number;\n balance: bigint;\n}\n\nexport interface RewardedPool {\n pool: Address;\n rewarder: Address;\n rewardToken: Address;\n minBinId: number;\n maxBinId: number;\n pid: number;\n stopped: boolean;\n tokenX: Address;\n tokenY: Address;\n symbolX: string;\n symbolY: string;\n isTopPool: boolean;\n moePerDay: number;\n rangeTvlUsd: number;\n poolTvlUsd: number;\n aprPercent: number;\n rewardedBins: number;\n /** Global: total net MOE/day flowing to all dynamic pools */\n totalMoePerDay?: number;\n moePriceUsd?: number;\n}\n\n// ============================================================\n// Helpers\n// ============================================================\n\n/** Decode address using a generic address ABI */\nconst _addressAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddressResult(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\n/** Decode uint256 from multicall returnData */\nconst _uint256Abi = parseAbi([\"function f() external view returns (uint256)\"]);\nfunction decodeUint256Result(data: Hex | null): bigint | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _uint256Abi, functionName: \"f\", data }) as bigint;\n } catch {\n return null;\n }\n}\n\n/** Decode bool from multicall returnData */\nconst _boolAbi = parseAbi([\"function f() external view returns (bool)\"]);\nfunction decodeBoolResult(data: Hex | null): boolean | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _boolAbi, functionName: \"f\", data }) as boolean;\n } catch {\n return null;\n }\n}\n\n/** Decode string from multicall returnData */\nfunction decodeStringResult(data: Hex | null): string {\n if (!data) return \"?\";\n try {\n return decodeFunctionResult({ abi: erc20Abi, functionName: \"symbol\", data }) as string;\n } catch {\n return \"?\";\n }\n}\n\n/** Decode getRewardedRange (returns (uint256, uint256)) */\nconst _rangeAbi = parseAbi([\"function f() external view returns (uint256 minBinId, uint256 maxBinId)\"]);\nfunction decodeRangeResult(data: Hex | null): [bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _rangeAbi, functionName: \"f\", data }) as [bigint, bigint];\n } catch {\n return null;\n }\n}\n\n/** Decode getBin result (uint128, uint128) */\nconst _binAbi = parseAbi([\"function f() external view returns (uint128 reserveX, uint128 reserveY)\"]);\nfunction decodeBinResult(data: Hex | null): [bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _binAbi, functionName: \"f\", data }) as [bigint, bigint];\n } catch {\n return null;\n }\n}\n\n/** Decode uint256[] (e.g. getTopPoolIds) */\nconst _uint256ArrayAbi = parseAbi([\"function f() external view returns (uint256[] memory)\"]);\nfunction decodeUint256ArrayResult(data: Hex | null): bigint[] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _uint256ArrayAbi, functionName: \"f\", data }) as bigint[];\n } catch {\n return null;\n }\n}\n\n/** Extract rewarder address from LB hooks params (lower 20 bytes of bytes32) */\nfunction extractRewarderAddress(hooksParams: Hex): Address | null {\n // hooksParams is a 32-byte hex string (0x + 64 hex chars)\n if (!hooksParams || hooksParams === \"0x0000000000000000000000000000000000000000000000000000000000000000\") {\n return null;\n }\n // Lower 20 bytes = last 40 hex characters of the 64-char data portion\n const hex = hooksParams.slice(2); // strip 0x\n if (hex.length < 64) return null;\n const addrHex = hex.slice(24, 64); // bytes 12..31 = lower 20 bytes\n if (addrHex === \"0000000000000000000000000000000000000000\") return null;\n return `0x${addrHex}` as Address;\n}\n\n/** Build uniform distribution arrays for LB add liquidity.\n *\n * Distribution rules:\n * - Bins strictly below active: only tokenY (distributionX[i]=0, distributionY[i]=share)\n * - Bin at active: tokenX and tokenY split 50/50\n * - Bins strictly above active: only tokenX (distributionX[i]=share, distributionY[i]=0)\n *\n * distributionX / distributionY sum to 1e18 respectively.\n */\nfunction buildUniformDistribution(\n deltaIds: number[],\n): { distributionX: bigint[]; distributionY: bigint[] } {\n const PRECISION = 10n ** 18n;\n const n = deltaIds.length;\n\n // Count how many bins receive X and Y\n const xBins = deltaIds.filter((d) => d >= 0).length; // active + above\n const yBins = deltaIds.filter((d) => d <= 0).length; // active + below\n\n const distributionX: bigint[] = [];\n const distributionY: bigint[] = [];\n\n for (const delta of deltaIds) {\n // X share: bins at or above active\n const xShare = delta >= 0 && xBins > 0 ? PRECISION / BigInt(xBins) : 0n;\n // Y share: bins at or below active\n const yShare = delta <= 0 && yBins > 0 ? PRECISION / BigInt(yBins) : 0n;\n distributionX.push(xShare);\n distributionY.push(yShare);\n }\n\n // Correct rounding on the active bin (index where delta === 0)\n // The sum must be exactly PRECISION; adjust the first qualifying element\n const xSum = distributionX.reduce((a, b) => a + b, 0n);\n const ySum = distributionY.reduce((a, b) => a + b, 0n);\n if (xSum > 0n && xSum !== PRECISION) {\n const firstX = distributionX.findIndex((v) => v > 0n);\n if (firstX !== -1) distributionX[firstX] += PRECISION - xSum;\n }\n if (ySum > 0n && ySum !== PRECISION) {\n const firstY = distributionY.findIndex((v) => v > 0n);\n if (firstY !== -1) distributionY[firstY] += PRECISION - ySum;\n }\n\n return { distributionX, distributionY };\n}\n\n// ============================================================\n// Adapter\n// ============================================================\n\nexport class MerchantMoeLBAdapter {\n private readonly protocolName: string;\n private readonly lbRouter: Address;\n private readonly lbFactory: Address;\n private readonly lbQuoter?: Address;\n private readonly rpcUrl?: string;\n /** WMNT address (lb_mid_wmnt in config) used for MOE price routing */\n private readonly wmnt?: Address;\n /** USDT address (lb_mid_usdt in config) used for MNT/USD price routing */\n private readonly usdt?: Address;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const lbRouter = entry.contracts?.[\"lb_router\"];\n if (!lbRouter) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'lb_router' contract address\");\n }\n const lbFactory = entry.contracts?.[\"lb_factory\"];\n if (!lbFactory) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'lb_factory' contract address\");\n }\n this.lbRouter = lbRouter;\n this.lbFactory = lbFactory;\n this.lbQuoter = entry.contracts?.[\"lb_quoter\"];\n this.wmnt = entry.contracts?.[\"lb_mid_wmnt\"];\n this.usdt = entry.contracts?.[\"lb_mid_usdt\"];\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n private requireRpc(): string {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(`[${this.protocolName}] RPC URL required`);\n }\n return this.rpcUrl;\n }\n\n /**\n * Build an addLiquidity transaction for a Liquidity Book pair.\n * Distributes tokenX/tokenY uniformly across active bin ± numBins.\n */\n async buildAddLiquidity(params: LBAddLiquidityParams): Promise<DeFiTx> {\n const numBins = params.numBins ?? 5;\n const deadline = params.deadline ?? BigInt(\"18446744073709551615\");\n\n // Resolve active bin id\n let activeIdDesired = params.activeIdDesired;\n if (activeIdDesired === undefined) {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n const activeId = await client.readContract({\n address: params.pool,\n abi: lbPairAbi,\n functionName: \"getActiveId\",\n });\n activeIdDesired = activeId as number;\n }\n\n // Build delta IDs: [-numBins, ..., -1, 0, 1, ..., numBins]\n const deltaIds: number[] = [];\n for (let d = -numBins; d <= numBins; d++) {\n deltaIds.push(d);\n }\n\n const { distributionX, distributionY } = buildUniformDistribution(deltaIds);\n\n const data = encodeFunctionData({\n abi: lbRouterAbi,\n functionName: \"addLiquidity\",\n args: [\n {\n tokenX: params.tokenX,\n tokenY: params.tokenY,\n binStep: BigInt(params.binStep),\n amountX: params.amountX,\n amountY: params.amountY,\n amountXMin: 0n,\n amountYMin: 0n,\n activeIdDesired: BigInt(activeIdDesired),\n idSlippage: BigInt(numBins + 2),\n deltaIds: deltaIds.map(BigInt),\n distributionX,\n distributionY,\n to: params.recipient,\n refundTo: params.recipient,\n deadline,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] LB addLiquidity ${params.amountX} tokenX + ${params.amountY} tokenY across ${deltaIds.length} bins`,\n to: this.lbRouter,\n data,\n value: 0n,\n gas_estimate: 800_000,\n approvals: [\n { token: params.tokenX, spender: this.lbRouter, amount: params.amountX },\n { token: params.tokenY, spender: this.lbRouter, amount: params.amountY },\n ],\n };\n }\n\n /**\n * Build a removeLiquidity transaction for specific LB bins.\n */\n async buildRemoveLiquidity(params: LBRemoveLiquidityParams): Promise<DeFiTx> {\n const deadline = params.deadline ?? BigInt(\"18446744073709551615\");\n\n const data = encodeFunctionData({\n abi: lbRouterAbi,\n functionName: \"removeLiquidity\",\n args: [\n params.tokenX,\n params.tokenY,\n params.binStep,\n params.amountXMin ?? 0n,\n params.amountYMin ?? 0n,\n params.binIds.map(BigInt),\n params.amounts,\n params.recipient,\n deadline,\n ],\n });\n\n return {\n description: `[${this.protocolName}] LB removeLiquidity from ${params.binIds.length} bins`,\n to: this.lbRouter,\n data,\n value: 0n,\n gas_estimate: 600_000,\n };\n }\n\n /**\n * Auto-detect bin IDs for a pool from the rewarder's rewarded range.\n * Falls back to active bin ± 50 scan if no rewarder exists.\n */\n private async autoDetectBins(pool: Address): Promise<number[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const hooksParams = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getLBHooksParameters\",\n }) as Hex;\n\n const rewarder = extractRewarderAddress(hooksParams);\n if (rewarder) {\n const range = await client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getRewardedRange\",\n }) as [bigint, bigint];\n const min = Number(range[0]);\n const max = Number(range[1]);\n const ids: number[] = [];\n for (let b = min; b <= max; b++) ids.push(b);\n return ids;\n }\n\n // No rewarder: scan active bin ± 50\n const activeId = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getActiveId\",\n }) as number;\n const ids: number[] = [];\n for (let b = activeId - 50; b <= activeId + 50; b++) ids.push(b);\n return ids;\n }\n\n /**\n * Get pending MOE rewards for a user across specified bin IDs.\n * If binIds is omitted, auto-detects from the rewarder's rewarded range.\n * Reads the rewarder address from the pool's hooks parameters.\n */\n async getPendingRewards(user: Address, pool: Address, binIds?: number[]): Promise<RewardInfo[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const hooksParams = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getLBHooksParameters\",\n }) as Hex;\n\n const rewarder = extractRewarderAddress(hooksParams);\n if (!rewarder) {\n return [];\n }\n\n // Auto-detect bins from rewarder range if not provided\n let resolvedBinIds = binIds;\n if (!resolvedBinIds || resolvedBinIds.length === 0) {\n const range = await client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getRewardedRange\",\n }) as [bigint, bigint];\n const min = Number(range[0]);\n const max = Number(range[1]);\n resolvedBinIds = [];\n for (let b = min; b <= max; b++) resolvedBinIds.push(b);\n }\n\n const [pending, rewardToken] = await Promise.all([\n client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getPendingRewards\",\n args: [user, resolvedBinIds.map(BigInt)],\n }),\n client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getRewardToken\",\n }),\n ]);\n\n return [\n {\n token: rewardToken as Address,\n symbol: \"MOE\",\n amount: pending as bigint,\n },\n ];\n }\n\n /**\n * Scan ±scanRange bins around the active bin and return the user's non-zero balance bin IDs.\n * Critical: the rewarder may track pending rewards for bins OUTSIDE its current rewarded range\n * (e.g. when the rewarded range shifts after a position was already in place). Always claim\n * against the user's actual positions, not the rewarder's \"current\" range.\n */\n async findUserBinsWithBalance(pool: Address, user: Address, scanRange = 50): Promise<number[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n const activeId = await client.readContract({\n address: pool, abi: lbPairAbi, functionName: \"getActiveId\",\n }) as number;\n const calls: Array<[Address, Hex]> = [];\n const binIds: number[] = [];\n for (let b = activeId - scanRange; b <= activeId + scanRange; b++) {\n binIds.push(b);\n calls.push([pool, encodeFunctionData({\n abi: parseAbi([\"function balanceOf(address account, uint256 id) view returns (uint256)\"]),\n functionName: \"balanceOf\",\n args: [user, BigInt(b)],\n })]);\n }\n const results = await multicallRead(rpcUrl, calls);\n const owned: number[] = [];\n for (let i = 0; i < binIds.length; i++) {\n const data = results[i];\n if (!data) continue;\n // Decode uint256 — non-zero last 32 bytes means user has balance in this bin\n const hex = data.slice(2).padStart(64, \"0\");\n if (hex !== \"0\".repeat(64)) owned.push(binIds[i]!);\n }\n return owned;\n }\n\n /**\n * Build a claim rewards transaction for specific LB bins.\n * If binIds is omitted, auto-detects from the user's actual non-zero balance bins (active ±50 scan).\n * This catches rewards accumulated in bins outside the rewarder's current rewarded range.\n */\n async buildClaimRewards(user: Address, pool: Address, binIds?: number[]): Promise<DeFiTx> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const hooksParams = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getLBHooksParameters\",\n }) as Hex;\n\n const rewarder = extractRewarderAddress(hooksParams);\n if (!rewarder) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${this.protocolName}] Pool ${pool} has no active rewarder`);\n }\n\n let resolvedBinIds = binIds;\n if (!resolvedBinIds || resolvedBinIds.length === 0) {\n // Prefer user's actual non-zero bins over rewarder's current range — the rewarder\n // may track pending rewards across bins where the user was previously LP'd.\n resolvedBinIds = await this.findUserBinsWithBalance(pool, user);\n if (resolvedBinIds.length === 0) {\n // Fallback: rewarder's current range (no user position case)\n const range = await client.readContract({\n address: rewarder, abi: lbRewarderAbi, functionName: \"getRewardedRange\",\n }) as [bigint, bigint];\n const min = Number(range[0]);\n const max = Number(range[1]);\n resolvedBinIds = [];\n for (let b = min; b <= max; b++) resolvedBinIds.push(b);\n }\n }\n\n const data = encodeFunctionData({\n abi: lbRewarderAbi,\n functionName: \"claim\",\n args: [user, resolvedBinIds.map(BigInt)],\n });\n\n return {\n description: `[${this.protocolName}] LB claim rewards for ${resolvedBinIds.length} bins`,\n to: rewarder,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n /**\n * Discover all active rewarded LB pools by iterating the factory.\n * Uses 7 multicall batches to minimise RPC round-trips and avoid 429s.\n *\n * Batch 1: getNumberOfLBPairs(), then getLBPairAtIndex(i) for all i\n * Batch 2: getLBHooksParameters() for all pairs → extract rewarder addresses\n * Batch 3: isStopped/getRewardedRange/getRewardToken/getPid/getMasterChef for each rewarder\n * Batch 4: getTokenX/getTokenY for each rewarded pair, then symbol() for unique tokens\n * Batch 5: Bootstrap MasterChef→VeMoe, then getMoePerSecond/getTreasuryShare/getStaticShare/getTotalWeight/getTopPoolIds\n * Batch 6: VeMoe.getWeight(pid) for each rewarded pool\n * Batch 7: Pool.getBin(binId) for all bins in rewarded range of each pool\n * Price: LB Quoter findBestPathFromAmountIn for MOE/WMNT and WMNT/USDT prices\n */\n async discoverRewardedPools(): Promise<RewardedPool[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n // --- Batch 1a: get pair count ---\n const pairCount = await client.readContract({\n address: this.lbFactory,\n abi: lbFactoryAbi,\n functionName: \"getNumberOfLBPairs\",\n }) as bigint;\n\n const count = Number(pairCount);\n if (count === 0) return [];\n\n // --- Batch 1b: getLBPairAtIndex for all indices ---\n const batch1Calls: Array<[Address, Hex]> = Array.from({ length: count }, (_, i) => [\n this.lbFactory,\n encodeFunctionData({ abi: lbFactoryAbi, functionName: \"getLBPairAtIndex\", args: [BigInt(i)] }),\n ]);\n const batch1Results = await multicallRead(rpcUrl, batch1Calls);\n\n const pairAddresses: Address[] = batch1Results\n .map((r) => decodeAddressResult(r))\n .filter((a): a is Address => a !== null);\n\n if (pairAddresses.length === 0) return [];\n\n // --- Batch 2: getLBHooksParameters for all pairs ---\n const batch2Calls: Array<[Address, Hex]> = pairAddresses.map((pair) => [\n pair,\n encodeFunctionData({ abi: lbPairAbi, functionName: \"getLBHooksParameters\" }),\n ]);\n const batch2Results = await multicallRead(rpcUrl, batch2Calls);\n\n // Filter pairs with a rewarder\n const rewardedPairs: Array<{ pool: Address; rewarder: Address }> = [];\n for (let i = 0; i < pairAddresses.length; i++) {\n const raw = batch2Results[i];\n if (!raw) continue;\n // getLBHooksParameters returns bytes32 — decode as raw bytes32 value\n let hooksBytes: Hex;\n try {\n const _bytes32Abi = parseAbi([\"function f() external view returns (bytes32)\"]);\n hooksBytes = decodeFunctionResult({ abi: _bytes32Abi, functionName: \"f\", data: raw }) as Hex;\n } catch {\n continue;\n }\n const rewarder = extractRewarderAddress(hooksBytes);\n if (rewarder) {\n rewardedPairs.push({ pool: pairAddresses[i]!, rewarder });\n }\n }\n\n if (rewardedPairs.length === 0) return [];\n\n // --- Batch 3: rewarder details (5 calls per rewarder, interleaved) ---\n const batch3Calls: Array<[Address, Hex]> = [];\n for (const { rewarder } of rewardedPairs) {\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"isStopped\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getRewardedRange\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getRewardToken\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getPid\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getMasterChef\" })]);\n }\n const batch3Results = await multicallRead(rpcUrl, batch3Calls);\n\n // --- Batch 4a: getTokenX / getTokenY for rewarded pairs ---\n const batch4aCalls: Array<[Address, Hex]> = [];\n for (const { pool } of rewardedPairs) {\n batch4aCalls.push([pool, encodeFunctionData({ abi: lbPairAbi, functionName: \"getTokenX\" })]);\n batch4aCalls.push([pool, encodeFunctionData({ abi: lbPairAbi, functionName: \"getTokenY\" })]);\n }\n const batch4aResults = await multicallRead(rpcUrl, batch4aCalls);\n\n // Collect unique token addresses for symbol lookup\n const tokenXAddresses: Array<Address | null> = [];\n const tokenYAddresses: Array<Address | null> = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n tokenXAddresses.push(decodeAddressResult(batch4aResults[i * 2] ?? null));\n tokenYAddresses.push(decodeAddressResult(batch4aResults[i * 2 + 1] ?? null));\n }\n\n const uniqueTokens = Array.from(\n new Set([...tokenXAddresses, ...tokenYAddresses].filter((a): a is Address => a !== null)),\n );\n\n // --- Batch 4b: symbol() for each unique token ---\n const batch4bCalls: Array<[Address, Hex]> = uniqueTokens.map((token) => [\n token,\n encodeFunctionData({ abi: erc20Abi, functionName: \"symbol\" }),\n ]);\n const batch4bResults = await multicallRead(rpcUrl, batch4bCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeStringResult(batch4bResults[i] ?? null));\n }\n\n // Extract per-pool data from batch 3 (5 calls per rewarder)\n const STRIDE3 = 5;\n const poolData: Array<{\n stopped: boolean;\n range: [bigint, bigint] | null;\n rewardToken: Address | null;\n pid: number;\n masterChef: Address | null;\n }> = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const base = i * STRIDE3;\n poolData.push({\n stopped: decodeBoolResult(batch3Results[base] ?? null) ?? false,\n range: decodeRangeResult(batch3Results[base + 1] ?? null),\n rewardToken: decodeAddressResult(batch3Results[base + 2] ?? null),\n pid: Number(decodeUint256Result(batch3Results[base + 3] ?? null) ?? 0n),\n masterChef: decodeAddressResult(batch3Results[base + 4] ?? null),\n });\n }\n\n // --- Batch 5: Bootstrap MasterChef/VeMoe, then fetch global emission params ---\n // Find the first valid MasterChef address from the rewarders\n const masterChefAddr = poolData.map((d) => d.masterChef).find((a): a is Address => a !== null) ?? null;\n\n let moePerDay = 0;\n let topPoolIds = new Set<number>();\n let totalWeightRaw = 0n;\n let veMoeAddr: Address | null = null;\n\n if (masterChefAddr) {\n // First get VeMoe address from MasterChef\n veMoeAddr = await client.readContract({\n address: masterChefAddr,\n abi: masterChefAbi,\n functionName: \"getVeMoe\",\n }) as Address;\n\n // Batch 5: MasterChef global data + VeMoe global data\n const batch5Calls: Array<[Address, Hex]> = [\n [masterChefAddr, encodeFunctionData({ abi: masterChefAbi, functionName: \"getMoePerSecond\" })],\n [masterChefAddr, encodeFunctionData({ abi: masterChefAbi, functionName: \"getTreasuryShare\" })],\n [masterChefAddr, encodeFunctionData({ abi: masterChefAbi, functionName: \"getStaticShare\" })],\n [veMoeAddr, encodeFunctionData({ abi: veMoeAbi, functionName: \"getTotalWeight\" })],\n [veMoeAddr, encodeFunctionData({ abi: veMoeAbi, functionName: \"getTopPoolIds\" })],\n ];\n const batch5Results = await multicallRead(rpcUrl, batch5Calls);\n\n const moePerSecRaw = decodeUint256Result(batch5Results[0] ?? null) ?? 0n;\n const treasuryShareRaw = decodeUint256Result(batch5Results[1] ?? null) ?? 0n;\n const staticShareRaw = decodeUint256Result(batch5Results[2] ?? null) ?? 0n;\n totalWeightRaw = decodeUint256Result(batch5Results[3] ?? null) ?? 0n;\n const topPoolIdsRaw = decodeUint256ArrayResult(batch5Results[4] ?? null) ?? [];\n\n topPoolIds = new Set(topPoolIdsRaw.map(Number));\n\n // Shares are fixed-point 1e18 fractions\n const PRECISION = 10n ** 18n;\n // net_moe_per_sec = total × (1 - treasury) × (1 - static)\n // expressed in bigint arithmetic to avoid float truncation\n const netPerSec =\n (moePerSecRaw * (PRECISION - treasuryShareRaw) / PRECISION) *\n (PRECISION - staticShareRaw) / PRECISION;\n\n // Convert to human-readable MOE/day (MOE has 18 decimals)\n // This is the total net MOE/day that flows to dynamic (VeMoe) pools\n moePerDay = Number(netPerSec * 86400n) / 1e18;\n }\n\n // --- Batch 6: VeMoe.getWeight(pid) for each rewarded pool ---\n const weightByPid = new Map<number, bigint>();\n if (veMoeAddr && rewardedPairs.length > 0) {\n const batch6Calls: Array<[Address, Hex]> = poolData.map((d) => [\n veMoeAddr!,\n encodeFunctionData({ abi: veMoeAbi, functionName: \"getWeight\", args: [BigInt(d.pid)] }),\n ]);\n const batch6Results = await multicallRead(rpcUrl, batch6Calls);\n for (let i = 0; i < poolData.length; i++) {\n weightByPid.set(poolData[i]!.pid, decodeUint256Result(batch6Results[i] ?? null) ?? 0n);\n }\n }\n\n // --- Price: MOE and WMNT prices in USD via LB Quoter ---\n // Route: MOE → WMNT → USDT (MOE has 18 decimals, WMNT has 18, USDT has 6)\n let moePriceUsd = 0;\n let wmntPriceUsd = 0;\n const MOE_ADDR = \"0x4515A45337F461A11Ff0FE8aBF3c606AE5dC00c9\" as Address;\n if (this.lbQuoter && this.wmnt && this.usdt) {\n try {\n const [moeWmntQuote, wmntUsdtQuote] = await Promise.all([\n client.readContract({\n address: this.lbQuoter,\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [[MOE_ADDR, this.wmnt], 10n ** 18n],\n }),\n client.readContract({\n address: this.lbQuoter,\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [[this.wmnt, this.usdt], 10n ** 18n],\n }),\n ]);\n // amounts[last] is the output amount (USDT has 6 decimals, WMNT has 18)\n const moeInWmnt = Number((moeWmntQuote as unknown as { amounts: bigint[] }).amounts.at(-1) ?? 0n) / 1e18;\n wmntPriceUsd = Number((wmntUsdtQuote as unknown as { amounts: bigint[] }).amounts.at(-1) ?? 0n) / 1e6;\n moePriceUsd = moeInWmnt * wmntPriceUsd;\n } catch {\n // Price fetch failed — APR will be 0\n }\n }\n\n // --- Resolve token prices for all pool tokens ---\n const stableSymbols = new Set([\"USDT\", \"USDC\", \"USDT0\", \"MUSD\", \"AUSD\", \"USDY\", \"FDUSD\", \"USDe\", \"sUSDe\"]);\n const mntSymbols = new Set([\"WMNT\", \"MNT\"]);\n const moeSymbols = new Set([\"MOE\"]);\n const sixDecimalStables = new Set([\"USDT\", \"USDC\", \"USDT0\", \"FDUSD\"]);\n\n // Address-based price & decimals maps\n const tokenPriceMap = new Map<string, number>();\n const tokenDecimalsMap = new Map<string, number>();\n\n // Seed known prices by symbol\n for (const [addr, sym] of symbolMap) {\n const key = addr.toLowerCase();\n if (stableSymbols.has(sym)) { tokenPriceMap.set(key, 1); tokenDecimalsMap.set(key, sixDecimalStables.has(sym) ? 6 : 18); }\n else if (mntSymbols.has(sym)) { tokenPriceMap.set(key, wmntPriceUsd); tokenDecimalsMap.set(key, 18); }\n else if (moeSymbols.has(sym)) { tokenPriceMap.set(key, moePriceUsd); tokenDecimalsMap.set(key, 18); }\n }\n\n // Collect unknown tokens from rewarded pools\n const unknownTokenAddrs: Address[] = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n for (const addr of [tokenXAddresses[i], tokenYAddresses[i]]) {\n if (addr && !tokenPriceMap.has(addr.toLowerCase())) {\n if (!unknownTokenAddrs.some(a => a.toLowerCase() === addr.toLowerCase())) {\n unknownTokenAddrs.push(addr);\n }\n }\n }\n }\n\n // Query decimals + prices for unknown tokens via LB Quoter\n if (unknownTokenAddrs.length > 0 && this.lbQuoter && this.wmnt && wmntPriceUsd > 0) {\n const erc20DecimalsAbi = parseAbi([\"function decimals() external view returns (uint8)\"]);\n\n // Batch: query decimals for all unknown tokens\n const decCalls: Array<[Address, Hex]> = unknownTokenAddrs.map(addr => [\n addr,\n encodeFunctionData({ abi: erc20DecimalsAbi, functionName: \"decimals\" }),\n ]);\n const decResults = await multicallRead(rpcUrl, decCalls).catch(() => [] as (Hex | undefined)[]);\n for (let i = 0; i < unknownTokenAddrs.length; i++) {\n const dec = decResults[i] ? Number(decodeUint256Result(decResults[i]!) ?? 18n) : 18;\n tokenDecimalsMap.set(unknownTokenAddrs[i]!.toLowerCase(), dec);\n }\n\n // Quote each unknown token → WMNT in parallel\n // Use small amount (0.01 token) to minimize slippage on thin pools\n const quotePromises = unknownTokenAddrs.map(async (tokenAddr) => {\n try {\n const dec = tokenDecimalsMap.get(tokenAddr.toLowerCase()) ?? 18;\n const quoteUnit = 10n ** BigInt(Math.max(dec - 2, 0)); // 0.01 token\n const quote = await client.readContract({\n address: this.lbQuoter!,\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [[tokenAddr, this.wmnt!], quoteUnit as unknown as bigint & { __brand: \"uint128\" }],\n });\n const amountOut = ((quote as unknown as { amounts: bigint[] }).amounts?.at(-1)) ?? 0n;\n // Scale back: price per 1 token = amountOut / quoteUnit * 10^dec / 10^18\n const priceInWmnt = (Number(amountOut) / 1e18) * (10 ** dec / Number(quoteUnit));\n return { addr: tokenAddr, price: priceInWmnt * wmntPriceUsd };\n } catch {\n return { addr: tokenAddr, price: 0 };\n }\n });\n const priceResults = await Promise.all(quotePromises);\n for (const { addr, price } of priceResults) {\n if (price > 0) tokenPriceMap.set(addr.toLowerCase(), price);\n }\n }\n\n // Price/decimals lookup by address\n const getTokenPriceUsd = (_sym: string, addr: Address): number => {\n return tokenPriceMap.get(addr.toLowerCase()) ?? 0;\n };\n const getTokenDecimals = (_sym: string, addr: Address): number => {\n return tokenDecimalsMap.get(addr.toLowerCase()) ?? 18;\n };\n\n // --- Batch 7: Pool.getBin(binId) for all bins in rewarded range ---\n type BinRequest = { poolIdx: number; binId: number };\n const binRequests: BinRequest[] = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const range = poolData[i]!.range;\n if (!range) continue;\n const minBin = Number(range[0]);\n const maxBin = Number(range[1]);\n for (let b = minBin; b <= maxBin; b++) {\n binRequests.push({ poolIdx: i, binId: b });\n }\n }\n\n const binReservesX = new Map<number, Map<number, bigint>>();\n const binReservesY = new Map<number, Map<number, bigint>>();\n\n if (binRequests.length > 0) {\n const batch7Calls: Array<[Address, Hex]> = binRequests.map(({ poolIdx, binId }) => [\n rewardedPairs[poolIdx]!.pool,\n encodeFunctionData({ abi: lbPairBinAbi, functionName: \"getBin\", args: [binId] }),\n ]);\n const batch7Results = await multicallRead(rpcUrl, batch7Calls);\n\n for (let j = 0; j < binRequests.length; j++) {\n const { poolIdx, binId } = binRequests[j]!;\n const decoded = decodeBinResult(batch7Results[j] ?? null);\n if (!decoded) continue;\n if (!binReservesX.has(poolIdx)) {\n binReservesX.set(poolIdx, new Map());\n binReservesY.set(poolIdx, new Map());\n }\n binReservesX.get(poolIdx)!.set(binId, decoded[0]);\n binReservesY.get(poolIdx)!.set(binId, decoded[1]);\n }\n }\n\n // --- Batch 8: Full pool TVL via ERC20 balanceOf(pool) for tokenX and tokenY ---\n const poolBalanceX = new Map<number, bigint>();\n const poolBalanceY = new Map<number, bigint>();\n {\n const balCalls: Array<[Address, Hex]> = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const tx = tokenXAddresses[i];\n const ty = tokenYAddresses[i];\n const pool = rewardedPairs[i]!.pool;\n balCalls.push([tx ?? (\"0x0000000000000000000000000000000000000000\" as Address), encodeFunctionData({ abi: erc20Abi, functionName: \"balanceOf\", args: [pool] })]);\n balCalls.push([ty ?? (\"0x0000000000000000000000000000000000000000\" as Address), encodeFunctionData({ abi: erc20Abi, functionName: \"balanceOf\", args: [pool] })]);\n }\n const balResults = await multicallRead(rpcUrl, balCalls).catch(() => [] as (Hex | undefined)[]);\n for (let i = 0; i < rewardedPairs.length; i++) {\n poolBalanceX.set(i, decodeUint256Result(balResults[i * 2] ?? null) ?? 0n);\n poolBalanceY.set(i, decodeUint256Result(balResults[i * 2 + 1] ?? null) ?? 0n);\n }\n }\n\n const results: RewardedPool[] = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const { pool, rewarder } = rewardedPairs[i]!;\n const data = poolData[i]!;\n\n const tokenX = tokenXAddresses[i] ?? (\"0x0000000000000000000000000000000000000000\" as Address);\n const tokenY = tokenYAddresses[i] ?? (\"0x0000000000000000000000000000000000000000\" as Address);\n const symX = symbolMap.get(tokenX) ?? \"?\";\n const symY = symbolMap.get(tokenY) ?? \"?\";\n\n const isTopPool = topPoolIds.has(data.pid);\n const weight = weightByPid.get(data.pid) ?? 0n;\n\n // Pool's MOE/day = total_net_moe_per_day × weight / total_weight\n // Only top pools (in VeMoe top list) receive dynamic emissions\n let poolMoePerDay = 0;\n if (isTopPool && totalWeightRaw > 0n && weight > 0n) {\n poolMoePerDay = moePerDay * (Number(weight) / Number(totalWeightRaw));\n }\n\n // Range TVL: sum bin reserves × token prices\n const rxMap = binReservesX.get(i);\n const ryMap = binReservesY.get(i);\n const range = data.range;\n let rangeTvlUsd = 0;\n let rewardedBins = 0;\n\n if (range) {\n const minBin = Number(range[0]);\n const maxBin = Number(range[1]);\n rewardedBins = maxBin - minBin + 1;\n if (rxMap && ryMap) {\n const priceX = getTokenPriceUsd(symX, tokenX);\n const priceY = getTokenPriceUsd(symY, tokenY);\n const decX = getTokenDecimals(symX, tokenX);\n const decY = getTokenDecimals(symY, tokenY);\n for (let b = minBin; b <= maxBin; b++) {\n const rx = rxMap.get(b) ?? 0n;\n const ry = ryMap.get(b) ?? 0n;\n rangeTvlUsd += (Number(rx) / 10 ** decX) * priceX;\n rangeTvlUsd += (Number(ry) / 10 ** decY) * priceY;\n }\n }\n }\n\n // Full pool TVL from balanceOf\n const priceX = getTokenPriceUsd(symX, tokenX);\n const priceY = getTokenPriceUsd(symY, tokenY);\n const decX = getTokenDecimals(symX, tokenX);\n const decY = getTokenDecimals(symY, tokenY);\n const fullBalX = poolBalanceX.get(i) ?? 0n;\n const fullBalY = poolBalanceY.get(i) ?? 0n;\n const poolTvlUsd = (Number(fullBalX) / 10 ** decX) * priceX + (Number(fullBalY) / 10 ** decY) * priceY;\n\n // APR = (poolMoePerDay * moePriceUsd * 365) / rangeTvlUsd * 100\n const aprPercent =\n rangeTvlUsd > 0 && moePriceUsd > 0\n ? (poolMoePerDay * moePriceUsd * 365 / rangeTvlUsd) * 100\n : 0;\n\n results.push({\n pool,\n rewarder,\n rewardToken: data.rewardToken ?? (\"0x0000000000000000000000000000000000000000\" as Address),\n minBinId: range ? Number(range[0]) : 0,\n maxBinId: range ? Number(range[1]) : 0,\n pid: data.pid,\n stopped: data.stopped,\n tokenX,\n tokenY,\n symbolX: symX,\n symbolY: symY,\n isTopPool,\n moePerDay: poolMoePerDay,\n rangeTvlUsd,\n poolTvlUsd,\n aprPercent,\n rewardedBins,\n totalMoePerDay: moePerDay,\n moePriceUsd,\n });\n }\n\n return results;\n }\n\n /**\n * Get a user's LB positions (bin balances) across a range of bin IDs.\n * If binIds is omitted, auto-detects from the rewarder's rewarded range (or active ± 50).\n */\n async getUserPositions(user: Address, pool: Address, binIds?: number[]): Promise<LBPosition[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const resolvedBinIds = (binIds && binIds.length > 0) ? binIds : await this.autoDetectBins(pool);\n\n const accounts = resolvedBinIds.map(() => user);\n const ids = resolvedBinIds.map(BigInt);\n\n const balances = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"balanceOfBatch\",\n args: [accounts, ids],\n }) as bigint[];\n\n return resolvedBinIds\n .map((binId, i) => ({ binId, balance: balances[i] ?? 0n }))\n .filter((p) => p.balance > 0n);\n }\n}\n","import {\n decodeAbiParameters,\n encodeFunctionData,\n encodeAbiParameters,\n http,\n createPublicClient,\n keccak256,\n parseAbi,\n decodeFunctionResult,\n zeroAddress,\n} from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type { DeFiTx } from \"@hypurrquant/defi-core\";\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\n/** KITTEN reward token on Hyper EVM */\nconst KITTEN_TOKEN: Address = \"0x618275f8efe54c2afa87bfb9f210a52f0ff89364\";\n\n/** WHYPE bonus reward token */\nconst WHYPE_TOKEN: Address = \"0x5555555555555555555555555555555555555555\";\n\n/** Max nonce to scan when discovering incentive keys */\nconst MAX_NONCE_SCAN = 60;\n\n/** HyperEVM well-known token addresses for pool discovery (matches solidly_gauge.ts) */\nconst HYPEREVM_TOKENS: Address[] = [\n \"0x5555555555555555555555555555555555555555\", // WHYPE\n \"0xb88339CB7199b77E23DB6E890353E22632Ba630f\", // USDC\n \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", // USDT0\n \"0xBe6727B535545C67d5cAa73dEa54865B92CF7907\", // UETH\n \"0x9FDBdA0A5e284c32744D2f17Ee5c74B284993463\", // UBTC\n \"0x111111a1a0667d36bD57c0A9f569b98057111111\", // USDH\n \"0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34\", // USDe\n \"0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2\", // sUSDe\n \"0xf4D9235269a96aaDaFc9aDAe454a0618eBE37949\", // XAUt0\n \"0xfD739d4e423301CE9385c1fb8850539D657C296D\", // kHYPE\n KITTEN_TOKEN, // KITTEN\n];\n\n// ─── ABIs ─────────────────────────────────────────────────────────────────────\n\nconst farmingCenterAbi = parseAbi([\n \"function multicall(bytes[] calldata data) external payable returns (bytes[] memory results)\",\n \"function enterFarming((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external\",\n \"function exitFarming((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external\",\n \"function collectRewards((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external\",\n \"function claimReward(address rewardToken, address to, uint256 amountRequested) external returns (uint256 reward)\",\n]);\n\nconst positionManagerAbi = parseAbi([\n \"function approveForFarming(uint256 tokenId, bool approve, address farmingAddress) external\",\n \"function farmingApprovals(uint256 tokenId) external view returns (address)\",\n]);\n\nconst eternalFarmingAbi = parseAbi([\n \"function incentives(bytes32 incentiveId) external view returns (uint256 totalReward, uint256 bonusReward, address virtualPoolAddress, uint24 minimalPositionWidth, bool deactivated, address pluginAddress)\",\n \"function getRewardInfo((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external view returns (uint256 reward, uint256 bonusReward)\",\n]);\n\nconst algebraFactoryAbi = parseAbi([\n \"function poolByPair(address tokenA, address tokenB) external view returns (address pool)\",\n]);\n\n// Decode helpers\nconst _addressDecodeAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressDecodeAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface IncentiveKey {\n rewardToken: Address;\n bonusRewardToken: Address;\n pool: Address;\n nonce: bigint;\n}\n\nexport interface FarmingPool {\n pool: Address;\n key: IncentiveKey;\n totalReward: bigint;\n bonusReward: bigint;\n active: boolean;\n}\n\n// ─── Helper ───────────────────────────────────────────────────────────────────\n\n/** Compute the incentiveId hash for an IncentiveKey (keccak256(abi.encode(key))) */\nfunction incentiveId(key: IncentiveKey): Hex {\n return keccak256(\n encodeAbiParameters(\n [\n { name: \"rewardToken\", type: \"address\" },\n { name: \"bonusRewardToken\", type: \"address\" },\n { name: \"pool\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n [key.rewardToken, key.bonusRewardToken, key.pool, key.nonce],\n ),\n );\n}\n\n/** Build the enterFarming calldata (without selector overhead — for use inside multicall) */\nfunction encodeEnterFarming(key: IncentiveKey, tokenId: bigint): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"enterFarming\",\n args: [key, tokenId],\n });\n}\n\n/** Build the exitFarming calldata */\nfunction encodeExitFarming(key: IncentiveKey, tokenId: bigint): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"exitFarming\",\n args: [key, tokenId],\n });\n}\n\n/** Build the collectRewards calldata */\nfunction encodeCollectRewards(key: IncentiveKey, tokenId: bigint): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"collectRewards\",\n args: [key, tokenId],\n });\n}\n\n/** Build the claimReward calldata */\nfunction encodeClaimReward(rewardToken: Address, to: Address): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"claimReward\",\n args: [rewardToken, to, 2n ** 256n - 1n], // max uint256 (KittenSwap variant uses uint256 amount, not uint128)\n });\n}\n\n/** Encode the top-level multicall wrapping an array of calldatas */\nfunction encodeMulticall(calls: Hex[]): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"multicall\",\n args: [calls],\n });\n}\n\n// ─── Runtime cache ───────────────────────────────────────────────────────────\n\n/** Runtime cache: pool (lowercased) → discovered nonce. Avoids repeated scans within a session. */\nconst nonceCache = new Map<string, bigint>();\n\n// ─── Adapter ──────────────────────────────────────────────────────────────────\n\nexport class KittenSwapFarmingAdapter {\n private readonly protocolName: string;\n private readonly farmingCenter: Address;\n private readonly eternalFarming: Address;\n private readonly positionManager: Address;\n private readonly rpcUrl: string;\n private readonly factory: Address | undefined;\n private readonly rewardToken: Address;\n private readonly bonusRewardToken: Address;\n\n constructor(\n protocolName: string,\n farmingCenter: Address,\n eternalFarming: Address,\n positionManager: Address,\n rpcUrl: string,\n factory?: Address,\n rewardToken: Address = KITTEN_TOKEN,\n bonusRewardToken: Address = WHYPE_TOKEN,\n ) {\n this.protocolName = protocolName;\n this.farmingCenter = farmingCenter;\n this.eternalFarming = eternalFarming;\n this.positionManager = positionManager;\n this.rpcUrl = rpcUrl;\n this.factory = factory;\n this.rewardToken = rewardToken;\n this.bonusRewardToken = bonusRewardToken;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n /**\n * Discover the active IncentiveKey for a given pool.\n * 1. Check runtime cache\n * 2. Batch-query nonces 0-60 via single multicall (61 calls)\n * 3. Return first non-zero incentive (totalReward > 0 and not deactivated)\n */\n async discoverIncentiveKey(pool: Address): Promise<IncentiveKey | null> {\n const poolLc = pool.toLowerCase();\n\n // Fast path: runtime cache\n if (nonceCache.has(poolLc)) {\n return {\n rewardToken: this.rewardToken,\n bonusRewardToken: this.bonusRewardToken,\n pool,\n nonce: nonceCache.get(poolLc)!,\n };\n }\n\n // Build 61 multicall calls for nonces 0-60\n const calls: Array<[Address, Hex]> = [];\n const nonces: bigint[] = [];\n for (let n = 0; n <= MAX_NONCE_SCAN; n++) {\n const nonce = BigInt(n);\n nonces.push(nonce);\n const key: IncentiveKey = {\n rewardToken: this.rewardToken,\n bonusRewardToken: this.bonusRewardToken,\n pool,\n nonce,\n };\n calls.push([\n this.eternalFarming,\n encodeFunctionData({\n abi: eternalFarmingAbi,\n functionName: \"incentives\",\n args: [incentiveId(key)],\n }),\n ]);\n }\n\n const results = await multicallRead(this.rpcUrl, calls);\n\n for (let i = 0; i < results.length; i++) {\n const data = results[i];\n if (!data || data.length < 66) continue;\n\n try {\n const decoded = decodeAbiParameters(\n [\n { name: \"totalReward\", type: \"uint256\" },\n { name: \"bonusReward\", type: \"uint256\" },\n { name: \"virtualPoolAddress\", type: \"address\" },\n { name: \"minimalPositionWidth\", type: \"uint24\" },\n { name: \"deactivated\", type: \"bool\" },\n { name: \"pluginAddress\", type: \"address\" },\n ],\n data,\n );\n\n const totalReward = decoded[0] as bigint;\n const deactivated = decoded[4] as boolean;\n\n if (totalReward > 0n && !deactivated) {\n const nonce = nonces[i]!;\n nonceCache.set(poolLc, nonce);\n return {\n rewardToken: this.rewardToken,\n bonusRewardToken: this.bonusRewardToken,\n pool,\n nonce,\n };\n }\n } catch {\n // skip decode errors\n }\n }\n\n return null;\n }\n\n /**\n * Build approveForFarming tx on the PositionManager.\n * Required before enterFarming if not already approved.\n */\n async buildApproveForFarming(tokenId: bigint): Promise<DeFiTx | null> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const currentApproval = await client.readContract({\n address: this.positionManager,\n abi: positionManagerAbi,\n functionName: \"farmingApprovals\",\n args: [tokenId],\n }) as Address;\n\n if (currentApproval.toLowerCase() === this.farmingCenter.toLowerCase()) {\n return null; // Already approved\n }\n\n return {\n description: `[${this.protocolName}] Approve NFT #${tokenId} for farming`,\n to: this.positionManager,\n data: encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"approveForFarming\",\n args: [tokenId, true, this.farmingCenter],\n }),\n value: 0n,\n gas_estimate: 60_000,\n };\n }\n\n /**\n * Build enterFarming tx for a position NFT.\n * Checks farming approval first and returns pre_txs if needed.\n */\n async buildEnterFarming(\n tokenId: bigint,\n pool: Address,\n _owner: Address,\n ): Promise<DeFiTx> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n throw new DefiError(\n \"CONTRACT_ERROR\",\n `[${this.protocolName}] No active incentive found for pool ${pool}`,\n );\n }\n\n const approveTx = await this.buildApproveForFarming(tokenId);\n\n return {\n description: `[${this.protocolName}] Enter farming for NFT #${tokenId} in pool ${pool}`,\n to: this.farmingCenter,\n data: encodeEnterFarming(key, tokenId),\n value: 0n,\n gas_estimate: 400_000,\n pre_txs: approveTx ? [approveTx] : undefined,\n };\n }\n\n /**\n * Build a tx that exits farming for a position NFT (unstakes).\n */\n async buildExitFarming(tokenId: bigint, pool: Address): Promise<DeFiTx> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n throw new DefiError(\n \"CONTRACT_ERROR\",\n `[${this.protocolName}] No active incentive found for pool ${pool}`,\n );\n }\n\n return {\n description: `[${this.protocolName}] Exit farming for NFT #${tokenId} in pool ${pool}`,\n to: this.farmingCenter,\n data: encodeExitFarming(key, tokenId),\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n /**\n * Build a multicall tx that collects rewards for a staked position and claims them.\n * Pattern: multicall([collectRewards(key, tokenId), claimReward(KITTEN, owner, max), claimReward(WHYPE, owner, max)])\n */\n async buildCollectRewards(\n tokenId: bigint,\n pool: Address,\n owner: Address,\n ): Promise<DeFiTx> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n throw new DefiError(\n \"CONTRACT_ERROR\",\n `[${this.protocolName}] No active incentive found for pool ${pool}`,\n );\n }\n\n const calls: Hex[] = [\n encodeCollectRewards(key, tokenId),\n encodeClaimReward(this.rewardToken, owner),\n encodeClaimReward(this.bonusRewardToken, owner),\n ];\n\n return {\n description: `[${this.protocolName}] Collect + claim rewards for NFT #${tokenId} in pool ${pool}`,\n to: this.farmingCenter,\n data: encodeMulticall(calls),\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n /**\n * Build a tx that only claims already-accumulated rewards (no position change needed).\n */\n async buildClaimReward(owner: Address): Promise<DeFiTx> {\n const calls: Hex[] = [\n encodeClaimReward(this.rewardToken, owner),\n encodeClaimReward(this.bonusRewardToken, owner),\n ];\n\n return {\n description: `[${this.protocolName}] Claim KITTEN + WHYPE farming rewards to ${owner}`,\n to: this.farmingCenter,\n data: encodeMulticall(calls),\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Query pending rewards for a staked position NFT.\n */\n async getPendingRewards(\n tokenId: bigint,\n pool: Address,\n ): Promise<{ reward: bigint; bonusReward: bigint }> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n return { reward: 0n, bonusReward: 0n };\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const result = await client.readContract({\n address: this.eternalFarming,\n abi: eternalFarmingAbi,\n functionName: \"getRewardInfo\",\n args: [key, tokenId],\n }) as readonly [bigint, bigint];\n\n return { reward: result[0], bonusReward: result[1] };\n }\n\n /**\n * Discover all KittenSwap pools with active farming incentives.\n *\n * Steps:\n * 1. Generate all unique token pair combos from HYPEREVM_TOKENS (includes KITTEN)\n * 2. Batch poolByPair calls via multicall against the Algebra factory\n * 3. For each found pool, batch-scan nonces 0-60 via multicall\n * 4. Return enriched FarmingPool[] for pools with active incentives\n */\n async discoverFarmingPools(): Promise<FarmingPool[]> {\n if (!this.factory) {\n return [];\n }\n\n // Step 1: generate all unique token pairs\n const pairs: Array<[Address, Address]> = [];\n for (let i = 0; i < HYPEREVM_TOKENS.length; i++) {\n for (let j = i + 1; j < HYPEREVM_TOKENS.length; j++) {\n pairs.push([HYPEREVM_TOKENS[i]!, HYPEREVM_TOKENS[j]!]);\n }\n }\n\n // Step 2: batch poolByPair calls\n const poolByPairCalls: Array<[Address, Hex]> = pairs.map(([tokenA, tokenB]) => [\n this.factory!,\n encodeFunctionData({\n abi: algebraFactoryAbi,\n functionName: \"poolByPair\",\n args: [tokenA, tokenB],\n }),\n ]);\n\n const poolResults = await multicallRead(this.rpcUrl, poolByPairCalls);\n\n // Collect unique non-zero pool addresses\n const poolSet = new Set<string>();\n for (const data of poolResults) {\n const addr = decodeAddress(data);\n if (addr && addr !== zeroAddress) {\n poolSet.add(addr.toLowerCase());\n }\n }\n\n if (poolSet.size === 0) return [];\n\n const pools = Array.from(poolSet) as Address[];\n\n // Step 3: for each pool, batch-scan nonces 0-60 via a single multicall per pool.\n // We build all nonce calls for all pools in one big multicall to minimize RPC round-trips.\n const NONCE_COUNT = MAX_NONCE_SCAN + 1; // 61\n const allNonceCalls: Array<[Address, Hex]> = [];\n for (const pool of pools) {\n for (let n = 0; n <= MAX_NONCE_SCAN; n++) {\n const key: IncentiveKey = {\n rewardToken: this.rewardToken,\n bonusRewardToken: this.bonusRewardToken,\n pool: pool as Address,\n nonce: BigInt(n),\n };\n allNonceCalls.push([\n this.eternalFarming,\n encodeFunctionData({\n abi: eternalFarmingAbi,\n functionName: \"incentives\",\n args: [incentiveId(key)],\n }),\n ]);\n }\n }\n\n const allNonceResults = await multicallRead(this.rpcUrl, allNonceCalls);\n\n // Step 4: find best active incentive per pool and build result\n const results: FarmingPool[] = [];\n\n for (let pi = 0; pi < pools.length; pi++) {\n const pool = pools[pi]! as Address;\n const poolLc = pool.toLowerCase();\n const base = pi * NONCE_COUNT;\n\n let bestKey: IncentiveKey | null = null;\n let bestTotalReward = 0n;\n let bestBonusReward = 0n;\n let bestActive = false;\n\n for (let n = 0; n <= MAX_NONCE_SCAN; n++) {\n const data = allNonceResults[base + n];\n if (!data || data.length < 66) continue;\n\n try {\n const decoded = decodeAbiParameters(\n [\n { name: \"totalReward\", type: \"uint256\" },\n { name: \"bonusReward\", type: \"uint256\" },\n { name: \"virtualPoolAddress\", type: \"address\" },\n { name: \"minimalPositionWidth\", type: \"uint24\" },\n { name: \"deactivated\", type: \"bool\" },\n { name: \"pluginAddress\", type: \"address\" },\n ],\n data,\n );\n\n const totalReward = decoded[0] as bigint;\n const bonusReward = decoded[1] as bigint;\n const deactivated = decoded[4] as boolean;\n\n if (totalReward > 0n) {\n const nonce = BigInt(n);\n const isActive = !deactivated;\n\n // Prefer active incentives; among active ones, prefer higher nonce (newer)\n if (!bestKey || (isActive && !bestActive) || (isActive === bestActive && nonce > bestKey.nonce)) {\n bestKey = {\n rewardToken: this.rewardToken,\n bonusRewardToken: this.bonusRewardToken,\n pool,\n nonce,\n };\n bestTotalReward = totalReward;\n bestBonusReward = bonusReward;\n bestActive = isActive;\n }\n }\n } catch {\n // skip decode errors\n }\n }\n\n if (bestKey) {\n // Cache the discovered nonce\n nonceCache.set(poolLc, bestKey.nonce);\n results.push({\n pool,\n key: bestKey,\n totalReward: bestTotalReward,\n bonusReward: bestBonusReward,\n active: bestActive,\n });\n }\n }\n\n return results;\n }\n}\n","import { DefiError, type ProtocolEntry, type RewardInfo, type DeFiTx } from \"@hypurrquant/defi-core\";\nimport type { Address, Hex } from \"viem\";\n\nconst DEFAULT_BASE_URL = \"https://app.usenest.xyz/api/blaze\";\nconst FALLBACK_BASE_URL = \"https://blaze.nest.aegas.it\";\n\nconst NEST_TOKEN: Address = \"0x07c57E32a3C29D5659bda1d3EFC2E7BF004E3035\";\nconst NEST_DECIMALS = 18;\n\nexport interface NestClaimStatus {\n totalClaimedRaw: bigint;\n totalAvailableRaw: bigint;\n pendingRaw: bigint;\n pendingFormatted: number;\n}\n\nexport interface NestClaimTicket {\n user: Address;\n amount: bigint;\n timestamp: bigint;\n day: bigint | null;\n signature: Hex;\n}\n\nexport interface NestAprEstimateParams {\n poolAddress: Address;\n minTick: number;\n maxTick: number;\n token0Amount: bigint;\n token1Amount: bigint;\n}\n\nexport class NestOffChainAdapter {\n private readonly baseUrl: string;\n private readonly fallbackUrl: string;\n private readonly voter: Address;\n\n constructor(entry: ProtocolEntry) {\n const voter = entry.contracts?.[\"voter\"];\n if (!voter) {\n throw DefiError.contractError(\"Nest off-chain: missing 'voter' contract\");\n }\n this.voter = voter;\n this.baseUrl = process.env[\"NEST_API_URL\"] ?? DEFAULT_BASE_URL;\n this.fallbackUrl = FALLBACK_BASE_URL;\n }\n\n name(): string {\n return \"Nest\";\n }\n\n /** Cumulative claimed + available NEST emissions for a wallet */\n async getClaimStatus(wallet: Address): Promise<NestClaimStatus> {\n const data = await this.fetchJson<{ totalClaimed: string; totalAvailable: string }>(\n `/claim/claim-status?publicAddress=${wallet}`,\n );\n const totalClaimedRaw = BigInt(data.totalClaimed);\n const totalAvailableRaw = BigInt(data.totalAvailable);\n const pendingRaw = totalAvailableRaw > totalClaimedRaw\n ? totalAvailableRaw - totalClaimedRaw\n : 0n;\n return {\n totalClaimedRaw,\n totalAvailableRaw,\n pendingRaw,\n pendingFormatted: Number(pendingRaw) / 10 ** NEST_DECIMALS,\n };\n }\n\n /**\n * Backend-signed claim ticket (or null when nothing to claim).\n * Returns the raw ticket; `buildClaim()` is not yet implemented because the\n * voter contract source is unverified — function selector 0xd6d7a454 takes\n * 5 dynamic arrays we have not been able to disambiguate yet.\n */\n async getClaimTicket(wallet: Address): Promise<NestClaimTicket | null> {\n const url = `${this.baseUrl}/claim/claim-data?publicAddress=${wallet}`;\n const res = await fetch(url, this.requestInit());\n const text = await res.text();\n if (text.includes(\"no points to claim\")) return null;\n if (!res.ok) {\n throw DefiError.providerError(`Nest claim-data ${res.status}: ${text.slice(0, 200)}`);\n }\n let json: { user: string; amount: string; timestamp: string; day: string | null; signature: string };\n try {\n json = JSON.parse(text);\n } catch {\n throw DefiError.providerError(`Nest claim-data: non-JSON response: ${text.slice(0, 200)}`);\n }\n return {\n user: json.user as Address,\n amount: BigInt(json.amount),\n timestamp: BigInt(json.timestamp),\n day: json.day === null ? null : BigInt(json.day),\n signature: (json.signature.startsWith(\"0x\") ? json.signature : `0x${json.signature}`) as Hex,\n };\n }\n\n /** APR estimate (percent) for a CL position with given tick range and amounts */\n async estimateLpApr(params: NestAprEstimateParams): Promise<number> {\n const qs = new URLSearchParams({\n poolAddress: params.poolAddress,\n minTick: String(params.minTick),\n maxTick: String(params.maxTick),\n token0Amount: params.token0Amount.toString(),\n token1Amount: params.token1Amount.toString(),\n });\n const data = await this.fetchJson<{ apr: string }>(`/liquidity/apr/estimate?${qs}`);\n const apr = Number(data.apr);\n if (!Number.isFinite(apr)) {\n throw DefiError.providerError(`Nest apr/estimate: invalid apr value '${data.apr}'`);\n }\n return apr;\n }\n\n /** Pending NEST emissions as IGauge-compatible RewardInfo[] */\n async getPendingRewards(user: Address): Promise<RewardInfo[]> {\n const status = await this.getClaimStatus(user);\n if (status.pendingRaw === 0n) return [];\n return [{\n token: NEST_TOKEN,\n symbol: \"NEST\",\n amount: status.pendingRaw,\n }];\n }\n\n /** Voter address used by aggregateClaim() — exposed for callers that build the tx themselves */\n getVoterAddress(): Address {\n return this.voter;\n }\n\n /**\n * Build a Nest voter claim transaction by reproducing the byte-level calldata\n * pattern observed in successful onchain claims, swapping in the ticket's\n * (amount, timestamp, signature) words.\n *\n * The voter implementation source is not verified, so we cannot derive a\n * Solidity ABI for selector 0xd6d7a454. Instead, two known-successful claim\n * transactions were diffed:\n *\n * tx1: 0x99f35cfdb6fc3885ebe046c4625acc083e42d5afe6ca6962c6c81cd9006b99ba\n * tx2: 0x3e120ab95e9e0a9148cb8964993dd066b8a36363353fe727462231857724e7bb\n *\n * 31 of 34 calldata words are identical between the two; only words 21, 22,\n * 25, 26, 27 differ — and those map exactly to the backend ticket's\n * (amount, timestamp, sigR, sigS, sigVPadded). msg.sender is not encoded in\n * calldata; voter binds the claim to the caller, so the ticket signature\n * authorizes the EOA holding the wallet.\n *\n * Throws if no claim ticket is available.\n */\n async buildClaim(wallet: Address): Promise<DeFiTx> {\n const ticket = await this.getClaimTicket(wallet);\n if (!ticket) {\n throw DefiError.invalidParam(`Nest: no claim ticket available for ${wallet}`);\n }\n\n // Decompose the 65-byte signature into r (32) || s (32) || v (1)\n const sigHex = ticket.signature.startsWith(\"0x\") ? ticket.signature.slice(2) : ticket.signature;\n if (sigHex.length !== 130) {\n throw DefiError.providerError(`Nest: signature must be 65 bytes (130 hex chars), got ${sigHex.length}`);\n }\n const r = sigHex.slice(0, 64);\n const s = sigHex.slice(64, 128);\n const v = sigHex.slice(128, 130);\n const vPadded = v + \"0\".repeat(62); // last word: v in high byte + 31 zero bytes\n\n const amountHex = ticket.amount.toString(16).padStart(64, \"0\");\n const timestampHex = ticket.timestamp.toString(16).padStart(64, \"0\");\n\n // Calldata template: 34 words, derived from two verified onchain claim txs.\n // Mutable slots (ticket struct): 21=amount, 22=timestamp, 25=sigR, 26=sigS, 27=sigV+padding.\n const words = [\n \"0000000000000000000000000000000000000000000000000000000000000160\", // 0\n \"0000000000000000000000000000000000000000000000000000000000000180\", // 1\n \"0000000000000000000000000000000000000000000000000000000000000200\", // 2\n \"00000000000000000000000000000000000000000000000000000000000002a0\", // 3\n \"0000000000000000000000000000000000000000000000000000000000000380\", // 4\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 5\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 6\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 7\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 8\n \"0000000000000000000000000000000000000000000000000000000000000001\", // 9\n \"0000000000000000000000000000000000000000000000000000000000000001\", // 10\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 11 — empty array length\n \"0000000000000000000000000000000000000000000000000000000000000040\", // 12\n \"0000000000000000000000000000000000000000000000000000000000000060\", // 13\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 14\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 15\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 16\n \"0000000000000000000000000000000000000000000000000000000000000060\", // 17\n \"0000000000000000000000000000000000000000000000000000000000000080\", // 18\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 19\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 20\n amountHex, // 21 — ticket amount\n timestampHex, // 22 — ticket timestamp\n \"0000000000000000000000000000000000000000000000000000000000000060\", // 23 — sig offset\n \"0000000000000000000000000000000000000000000000000000000000000041\", // 24 — sig length (65)\n r, // 25 — sig r\n s, // 26 — sig s\n vPadded, // 27 — sig v + zero padding\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 28\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 29\n \"0000000000000000000000000000000000000000000000000000000000000001\", // 30\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 31\n \"00000000000000000000000000000000000000000000000000000000000000a0\", // 32\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 33\n ];\n const data = (\"0xd6d7a454\" + words.join(\"\")) as Hex;\n\n return {\n description: `[${this.name()}] Claim NEST emissions (${(Number(ticket.amount) / 1e18).toFixed(2)} NEST cumulative; backend-signed ts=${ticket.timestamp})`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 600_000,\n };\n }\n\n // ── internal ──\n\n private async fetchJson<T>(path: string): Promise<T> {\n const primary = `${this.baseUrl}${path.startsWith(\"/claim\") ? path : path}`;\n try {\n const res = await fetch(primary, this.requestInit());\n if (res.ok) return await res.json() as T;\n if (res.status >= 500) throw new Error(`upstream ${res.status}`);\n throw DefiError.providerError(`Nest API ${res.status}: ${(await res.text()).slice(0, 200)}`);\n } catch (e) {\n if (this.baseUrl === this.fallbackUrl) throw e;\n const fallback = `${this.fallbackUrl}${path}`;\n const res = await fetch(fallback, this.requestInit());\n if (!res.ok) {\n throw DefiError.providerError(`Nest fallback ${res.status}: ${(await res.text()).slice(0, 200)}`);\n }\n return await res.json() as T;\n }\n }\n\n private requestInit(): RequestInit {\n return { headers: { \"User-Agent\": \"defi-cli/0.5\", \"Accept\": \"application/json\" } };\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, decodeFunctionResult, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n multicallRead,\n decodeU256,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n InterestRateMode,\n} from \"@hypurrquant/defi-core\";\n\nconst POOL_ABI = parseAbi([\n \"function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external\",\n \"function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf) external\",\n \"function repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) external returns (uint256)\",\n \"function withdraw(address asset, uint256 amount, address to) external returns (uint256)\",\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n \"function getReserveData(address asset) external view returns (uint256 configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nconst INCENTIVES_ABI = parseAbi([\n \"function getIncentivesController() external view returns (address)\",\n]);\n\nconst REWARDS_CONTROLLER_ABI = parseAbi([\n \"function getRewardsByAsset(address asset) external view returns (address[])\",\n \"function getRewardsData(address asset, address reward) external view returns (uint256 index, uint256 emissionsPerSecond, uint256 lastUpdateTimestamp, uint256 distributionEnd)\",\n]);\n\nconst POOL_PROVIDER_ABI = parseAbi([\n \"function ADDRESSES_PROVIDER() external view returns (address)\",\n]);\n\nconst ADDRESSES_PROVIDER_ABI = parseAbi([\n \"function getPriceOracle() external view returns (address)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n \"function BASE_CURRENCY_UNIT() external view returns (uint256)\",\n]);\n\nconst ERC20_DECIMALS_ABI = parseAbi([\n \"function decimals() external view returns (uint8)\",\n]);\n\nfunction u256ToF64(v: bigint): number {\n const MAX_U128 = (1n << 128n) - 1n;\n if (v > MAX_U128) return Infinity;\n return Number(v);\n}\n\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data || data.length < 66) return null;\n // ABI-encoded address: 12 bytes padding + 20 bytes address (total 32 bytes = 64 hex chars + 0x)\n return `0x${data.slice(26, 66)}` as Address;\n}\n\nfunction decodeAddressArray(data: Hex | null): Address[] {\n if (!data) return [];\n try {\n return decodeFunctionResult({\n abi: REWARDS_CONTROLLER_ABI,\n functionName: \"getRewardsByAsset\",\n data,\n }) as Address[];\n } catch {\n return [];\n }\n}\n\nfunction decodeReserveData(data: Hex | null): ReturnType<typeof decodeFunctionResult> | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n data,\n });\n } catch {\n return null;\n }\n}\n\nfunction decodeRewardsData(data: Hex | null): [bigint, bigint, bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: REWARDS_CONTROLLER_ABI,\n functionName: \"getRewardsData\",\n data,\n }) as [bigint, bigint, bigint, bigint];\n } catch {\n return null;\n }\n}\n\nexport class AaveV3Adapter implements ILending {\n private readonly protocolName: string;\n private readonly pool: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const pool = entry.contracts?.[\"pool\"];\n if (!pool) throw DefiError.contractError(`[${entry.name}] Missing 'pool' contract address`);\n this.pool = pool;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount, params.on_behalf_of, 0],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"borrow\",\n args: [params.asset, params.amount, rateMode, 0, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"repay\",\n args: [params.asset, params.amount, rateMode, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n\n // Batch 1: getReserveData\n const reserveCallData = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n args: [asset],\n });\n const [reserveRaw] = await multicallRead(this.rpcUrl, [\n [this.pool, reserveCallData],\n ]).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData failed: ${e}`);\n });\n\n const reserveDecoded = decodeReserveData(reserveRaw ?? null);\n if (!reserveDecoded) {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData returned no data`);\n }\n const result = reserveDecoded as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, Address, Address, Address, Address, bigint, bigint, bigint];\n\n const RAY = 1e27;\n const SECONDS_PER_YEAR = 31536000;\n\n // Convert ray rate to APY: ((1 + rate/SECONDS_PER_YEAR)^SECONDS_PER_YEAR - 1) * 100\n const toApy = (rayRate: bigint): number => {\n const rate = Number(rayRate) / RAY;\n return (Math.pow(1 + rate / SECONDS_PER_YEAR, SECONDS_PER_YEAR) - 1) * 100;\n };\n\n const supplyRate = toApy(result[2]);\n const variableRate = toApy(result[4]);\n const stableRate = toApy(result[5]);\n\n const aTokenAddress = result[8] as Address;\n const variableDebtTokenAddress = result[10] as Address;\n\n // Batch 2: totalSupply for aToken + variableDebtToken\n const [supplyRaw, borrowRaw] = await multicallRead(this.rpcUrl, [\n [aTokenAddress, encodeFunctionData({ abi: ERC20_ABI, functionName: \"totalSupply\" })],\n [variableDebtTokenAddress, encodeFunctionData({ abi: ERC20_ABI, functionName: \"totalSupply\" })],\n ]);\n const totalSupply = decodeU256(supplyRaw ?? null);\n const totalBorrow = decodeU256(borrowRaw ?? null);\n\n const utilization = totalSupply > 0n\n ? Number((totalBorrow * 10000n) / totalSupply) / 100\n : 0;\n\n // Fetch incentive/reward data (best-effort, never breaks base rates)\n const supplyRewardTokens: string[] = [];\n const borrowRewardTokens: string[] = [];\n const supplyEmissions: string[] = [];\n const borrowEmissions: string[] = [];\n\n try {\n // Batch 3: getIncentivesController (single call)\n const [controllerRaw] = await multicallRead(this.rpcUrl, [\n [aTokenAddress, encodeFunctionData({ abi: INCENTIVES_ABI, functionName: \"getIncentivesController\" })],\n ]);\n const controllerAddr = decodeAddress(controllerRaw ?? null);\n\n if (controllerAddr && controllerAddr !== zeroAddress) {\n // Batch 4: getRewardsByAsset for aToken + variableDebtToken\n const [supplyRewardsRaw, borrowRewardsRaw] = await multicallRead(this.rpcUrl, [\n [controllerAddr, encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsByAsset\", args: [aTokenAddress] })],\n [controllerAddr, encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsByAsset\", args: [variableDebtTokenAddress] })],\n ]);\n const supplyRewards = decodeAddressArray(supplyRewardsRaw ?? null);\n const borrowRewards = decodeAddressArray(borrowRewardsRaw ?? null);\n\n // Batch 5: all getRewardsData calls for supply + borrow combined\n const rewardsDataCalls: Array<[Address, Hex]> = [\n ...supplyRewards.map((reward): [Address, Hex] => [\n controllerAddr,\n encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsData\", args: [aTokenAddress, reward] }),\n ]),\n ...borrowRewards.map((reward): [Address, Hex] => [\n controllerAddr,\n encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsData\", args: [variableDebtTokenAddress, reward] }),\n ]),\n ];\n\n if (rewardsDataCalls.length > 0) {\n const rewardsDataResults = await multicallRead(this.rpcUrl, rewardsDataCalls);\n\n const supplyDataResults = rewardsDataResults.slice(0, supplyRewards.length);\n const borrowDataResults = rewardsDataResults.slice(supplyRewards.length);\n\n for (let i = 0; i < supplyRewards.length; i++) {\n const data = decodeRewardsData(supplyDataResults[i] ?? null);\n if (data && data[1] > 0n) {\n supplyRewardTokens.push(supplyRewards[i]);\n supplyEmissions.push(data[1].toString());\n }\n }\n for (let i = 0; i < borrowRewards.length; i++) {\n const data = decodeRewardsData(borrowDataResults[i] ?? null);\n if (data && data[1] > 0n) {\n borrowRewardTokens.push(borrowRewards[i]);\n borrowEmissions.push(data[1].toString());\n }\n }\n }\n }\n } catch {\n // Incentives not supported by this deployment — silently ignore\n }\n\n // Calculate incentive APY from emissions using oracle prices\n let supplyIncentiveApy: number | undefined;\n let borrowIncentiveApy: number | undefined;\n\n const hasSupplyRewards = supplyRewardTokens.length > 0;\n const hasBorrowRewards = borrowRewardTokens.length > 0;\n\n if ((hasSupplyRewards || hasBorrowRewards) && totalSupply > 0n) {\n try {\n // Pool → AddressesProvider → Oracle (sequential, each depends on previous)\n const [providerRaw] = await multicallRead(this.rpcUrl, [\n [this.pool, encodeFunctionData({ abi: POOL_PROVIDER_ABI, functionName: \"ADDRESSES_PROVIDER\" })],\n ]);\n const providerAddr = decodeAddress(providerRaw ?? null);\n if (!providerAddr) throw new Error(\"No provider address\");\n\n const [oracleRaw] = await multicallRead(this.rpcUrl, [\n [providerAddr, encodeFunctionData({ abi: ADDRESSES_PROVIDER_ABI, functionName: \"getPriceOracle\" })],\n ]);\n const oracleAddr = decodeAddress(oracleRaw ?? null);\n if (!oracleAddr) throw new Error(\"No oracle address\");\n\n // Batch 6: assetPrice + BASE_CURRENCY_UNIT + asset decimals\n const [assetPriceRaw, baseCurrencyUnitRaw, assetDecimalsRaw] = await multicallRead(this.rpcUrl, [\n [oracleAddr, encodeFunctionData({ abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [asset] })],\n [oracleAddr, encodeFunctionData({ abi: ORACLE_ABI, functionName: \"BASE_CURRENCY_UNIT\" })],\n [asset, encodeFunctionData({ abi: ERC20_DECIMALS_ABI, functionName: \"decimals\" })],\n ]);\n\n const assetPrice = decodeU256(assetPriceRaw ?? null);\n const baseCurrencyUnit = decodeU256(baseCurrencyUnitRaw ?? null);\n // decimals() returns uint8, fits in lower bits of U256 slot\n const assetDecimals = assetDecimalsRaw ? Number(decodeU256(assetDecimalsRaw)) : 18;\n\n const priceUnit = Number(baseCurrencyUnit) || 1e8;\n const assetPriceF = Number(assetPrice) / priceUnit;\n const assetDecimalsDivisor = 10 ** assetDecimals;\n\n // Collect all unique reward tokens across supply + borrow\n const allRewardTokens = Array.from(new Set([...supplyRewardTokens, ...borrowRewardTokens])) as Address[];\n\n // Batch 7: price + decimals for all reward tokens combined\n const rewardPriceCalls: Array<[Address, Hex]> = allRewardTokens.flatMap((token): Array<[Address, Hex]> => [\n [oracleAddr, encodeFunctionData({ abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [token] })],\n [token, encodeFunctionData({ abi: ERC20_DECIMALS_ABI, functionName: \"decimals\" })],\n ]);\n\n const rewardPriceResults = rewardPriceCalls.length > 0\n ? await multicallRead(this.rpcUrl, rewardPriceCalls)\n : [];\n\n const rewardPriceMap = new Map<string, { price: bigint; decimals: number }>();\n for (let i = 0; i < allRewardTokens.length; i++) {\n const priceRaw = rewardPriceResults[i * 2] ?? null;\n const decimalsRaw = rewardPriceResults[i * 2 + 1] ?? null;\n const price = decodeU256(priceRaw);\n const decimals = decimalsRaw ? Number(decodeU256(decimalsRaw)) : 18;\n rewardPriceMap.set(allRewardTokens[i].toLowerCase(), { price, decimals });\n }\n\n // Supply-side incentive APY\n if (hasSupplyRewards) {\n let totalSupplyIncentiveUsdPerYear = 0;\n const totalSupplyUsd = (Number(totalSupply) / assetDecimalsDivisor) * assetPriceF;\n\n for (let i = 0; i < supplyRewardTokens.length; i++) {\n const emissionPerSec = BigInt(supplyEmissions[i]);\n const entry = rewardPriceMap.get(supplyRewardTokens[i].toLowerCase());\n const rewardPrice = entry?.price ?? 0n;\n const rewardDecimals = entry?.decimals ?? 18;\n if (rewardPrice > 0n) {\n const rewardPriceF = Number(rewardPrice) / priceUnit;\n const emissionPerYear = (Number(emissionPerSec) / (10 ** rewardDecimals)) * SECONDS_PER_YEAR;\n totalSupplyIncentiveUsdPerYear += emissionPerYear * rewardPriceF;\n }\n }\n if (totalSupplyUsd > 0) {\n supplyIncentiveApy = (totalSupplyIncentiveUsdPerYear / totalSupplyUsd) * 100;\n }\n }\n\n // Borrow-side incentive APY\n if (hasBorrowRewards && totalBorrow > 0n) {\n let totalBorrowIncentiveUsdPerYear = 0;\n const totalBorrowUsd = (Number(totalBorrow) / assetDecimalsDivisor) * assetPriceF;\n\n for (let i = 0; i < borrowRewardTokens.length; i++) {\n const emissionPerSec = BigInt(borrowEmissions[i]);\n const entry = rewardPriceMap.get(borrowRewardTokens[i].toLowerCase());\n const rewardPrice = entry?.price ?? 0n;\n const rewardDecimals = entry?.decimals ?? 18;\n if (rewardPrice > 0n) {\n const rewardPriceF = Number(rewardPrice) / priceUnit;\n const emissionPerYear = (Number(emissionPerSec) / (10 ** rewardDecimals)) * SECONDS_PER_YEAR;\n totalBorrowIncentiveUsdPerYear += emissionPerYear * rewardPriceF;\n }\n }\n if (totalBorrowUsd > 0) {\n borrowIncentiveApy = (totalBorrowIncentiveUsdPerYear / totalBorrowUsd) * 100;\n }\n }\n } catch {\n // Oracle not available — skip incentive APY calculation\n }\n }\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyRate,\n borrow_variable_apy: variableRate,\n borrow_stable_apy: stableRate,\n utilization,\n total_supply: totalSupply,\n total_borrow: totalBorrow,\n ...(hasSupplyRewards && {\n supply_reward_tokens: supplyRewardTokens,\n supply_emissions_per_second: supplyEmissions,\n }),\n ...(hasBorrowRewards && {\n borrow_reward_tokens: borrowRewardTokens,\n borrow_emissions_per_second: borrowEmissions,\n }),\n ...(supplyIncentiveApy !== undefined && { supply_incentive_apy: supplyIncentiveApy }),\n ...(borrowIncentiveApy !== undefined && { borrow_incentive_apy: borrowIncentiveApy }),\n };\n }\n\n async getUserPosition(user: Address): Promise<UserPosition> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getUserAccountData\",\n args: [user],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getUserAccountData failed: ${e}`);\n });\n\n const [totalCollateralBase, totalDebtBase, , , ltv, healthFactor] = result;\n const MAX_UINT256 = 2n ** 256n - 1n;\n const hf = healthFactor >= MAX_UINT256 ? Infinity : Number(healthFactor) / 1e18;\n const collateralUsd = u256ToF64(totalCollateralBase) / 1e8;\n const debtUsd = u256ToF64(totalDebtBase) / 1e8;\n const ltvBps = u256ToF64(ltv);\n\n const supplies = collateralUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Collateral\", amount: totalCollateralBase, value_usd: collateralUsd }]\n : [];\n const borrows = debtUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Debt\", amount: totalDebtBase, value_usd: debtUsd }]\n : [];\n\n return {\n protocol: this.protocolName,\n user,\n supplies,\n borrows,\n health_factor: hf,\n net_apy: ltvBps / 100,\n };\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n InterestRateMode,\n} from \"@hypurrquant/defi-core\";\n\n// V2 uses deposit/borrow/repay/withdraw (same as V3 for borrow/repay/withdraw)\nconst POOL_ABI = parseAbi([\n \"function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external\",\n \"function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf) external\",\n \"function repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) external returns (uint256)\",\n \"function withdraw(address asset, uint256 amount, address to) external returns (uint256)\",\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n // V2 getReserveData: 12 fields (no accruedToTreasury/unbacked/isolationModeTotalDebt)\n // positions: [0]=configuration, [1]=liquidityIndex, [2]=variableBorrowIndex,\n // [3]=currentLiquidityRate, [4]=currentVariableBorrowRate, [5]=currentStableBorrowRate,\n // [6]=lastUpdateTimestamp, [7]=aTokenAddress, [8]=stableDebtTokenAddress,\n // [9]=variableDebtTokenAddress, [10]=interestRateStrategyAddress, [11]=id\n \"function getReserveData(address asset) external view returns (uint256 configuration, uint128 liquidityIndex, uint128 variableBorrowIndex, uint128 currentLiquidityRate, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint8 id)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nfunction u256ToF64(v: bigint): number {\n const MAX_U128 = (1n << 128n) - 1n;\n if (v > MAX_U128) return Infinity;\n return Number(v);\n}\n\nexport class AaveV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly pool: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const pool = entry.contracts?.[\"pool\"];\n if (!pool) throw DefiError.contractError(`[${entry.name}] Missing 'pool' contract address`);\n this.pool = pool;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"deposit\",\n args: [params.asset, params.amount, params.on_behalf_of, 0],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"borrow\",\n args: [params.asset, params.amount, rateMode, 0, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"repay\",\n args: [params.asset, params.amount, rateMode, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n args: [asset],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData failed: ${e}`);\n });\n\n const RAY = 1e27;\n const SECONDS_PER_YEAR = 31536000;\n\n // Convert ray rate to APY: ((1 + rate/SECONDS_PER_YEAR)^SECONDS_PER_YEAR - 1) * 100\n const toApy = (rayRate: bigint): number => {\n const rate = Number(rayRate) / RAY;\n return (Math.pow(1 + rate / SECONDS_PER_YEAR, SECONDS_PER_YEAR) - 1) * 100;\n };\n\n // V2 field positions:\n // [3] = currentLiquidityRate, [4] = currentVariableBorrowRate, [5] = currentStableBorrowRate\n // [7] = aTokenAddress, [9] = variableDebtTokenAddress\n const supplyRate = toApy(result[3]);\n const variableRate = toApy(result[4]);\n const stableRate = toApy(result[5]);\n\n const aTokenAddress = result[7] as Address;\n const variableDebtTokenAddress = result[9] as Address;\n\n const [totalSupply, totalBorrow] = await Promise.all([\n client.readContract({\n address: aTokenAddress,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch(() => 0n),\n client.readContract({\n address: variableDebtTokenAddress,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch(() => 0n),\n ]);\n\n const utilization = totalSupply > 0n\n ? Number((totalBorrow * 10000n) / totalSupply) / 100\n : 0;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyRate,\n borrow_variable_apy: variableRate,\n borrow_stable_apy: stableRate,\n utilization,\n total_supply: totalSupply,\n total_borrow: totalBorrow,\n };\n }\n\n async getUserPosition(user: Address): Promise<UserPosition> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getUserAccountData\",\n args: [user],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getUserAccountData failed: ${e}`);\n });\n\n const [totalCollateralBase, totalDebtBase, , , ltv, healthFactor] = result;\n const MAX_UINT256 = 2n ** 256n - 1n;\n const hf = healthFactor >= MAX_UINT256 ? Infinity : Number(healthFactor) / 1e18;\n // V2 returns values in ETH (18 decimals) vs V3's base currency (8 decimals)\n const collateralUsd = u256ToF64(totalCollateralBase) / 1e18;\n const debtUsd = u256ToF64(totalDebtBase) / 1e18;\n const ltvBps = u256ToF64(ltv);\n\n const supplies = collateralUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Collateral\", amount: totalCollateralBase, value_usd: collateralUsd }]\n : [];\n const borrows = debtUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Debt\", amount: totalDebtBase, value_usd: debtUsd }]\n : [];\n\n return {\n protocol: this.protocolName,\n user,\n supplies,\n borrows,\n health_factor: hf,\n net_apy: ltvBps / 100,\n };\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry, type PriceData } from \"@hypurrquant/defi-core\";\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n \"function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory)\",\n \"function BASE_CURRENCY_UNIT() external view returns (uint256)\",\n]);\n\nexport class AaveOracleAdapter implements IOracle {\n private readonly protocolName: string;\n private readonly oracle: Address;\n private readonly rpcUrl: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!rpcUrl) throw DefiError.rpcError(`[${entry.name}] RPC URL required for oracle`);\n this.rpcUrl = rpcUrl;\n const oracle = entry.contracts?.[\"oracle\"];\n if (!oracle) throw DefiError.contractError(`[${entry.name}] Missing 'oracle' contract address`);\n this.oracle = oracle;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getPrice(asset: Address): Promise<PriceData> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const baseUnit = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"BASE_CURRENCY_UNIT\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] BASE_CURRENCY_UNIT failed: ${e}`);\n });\n\n const priceVal = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"getAssetPrice\",\n args: [asset],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getAssetPrice failed: ${e}`);\n });\n\n const priceF64 = baseUnit > 0n ? Number(priceVal) / Number(baseUnit) : 0;\n const priceUsd = baseUnit > 0n\n ? (priceVal * (10n ** 18n)) / baseUnit\n : 0n;\n\n return {\n source: `${this.protocolName} Oracle`,\n source_type: \"oracle\",\n asset,\n price_usd: priceUsd,\n price_f64: priceF64,\n };\n }\n\n async getPrices(assets: Address[]): Promise<PriceData[]> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const baseUnit = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"BASE_CURRENCY_UNIT\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] BASE_CURRENCY_UNIT failed: ${e}`);\n });\n\n const rawPrices = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"getAssetsPrices\",\n args: [assets],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getAssetsPrices failed: ${e}`);\n });\n\n return (rawPrices as bigint[]).map((priceVal, i) => {\n const priceF64 = baseUnit > 0n ? Number(priceVal) / Number(baseUnit) : 0;\n const priceUsd = baseUnit > 0n ? (priceVal * (10n ** 18n)) / baseUnit : 0n;\n return {\n source: `${this.protocolName} Oracle`,\n source_type: \"oracle\",\n asset: assets[i]!,\n price_usd: priceUsd,\n price_f64: priceF64,\n };\n });\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst CTOKEN_ABI = parseAbi([\n \"function supplyRatePerBlock() external view returns (uint256)\",\n \"function borrowRatePerBlock() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrows() external view returns (uint256)\",\n \"function mint(uint256 mintAmount) external returns (uint256)\",\n \"function redeem(uint256 redeemTokens) external returns (uint256)\",\n \"function borrow(uint256 borrowAmount) external returns (uint256)\",\n \"function repayBorrow(uint256 repayAmount) external returns (uint256)\",\n]);\n\n// ~3s blocks on BSC\nconst BSC_BLOCKS_PER_YEAR = 10_512_000;\n\nexport class CompoundV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly defaultVtoken: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const vtoken =\n contracts[\"vusdt\"] ??\n contracts[\"vusdc\"] ??\n contracts[\"vbnb\"] ??\n contracts[\"comptroller\"];\n if (!vtoken) throw DefiError.contractError(\"Missing vToken or comptroller address\");\n this.defaultVtoken = vtoken;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"mint\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"borrow\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"repayBorrow\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"redeem\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw from Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [supplyRate, borrowRate, totalSupply, totalBorrows] = await Promise.all([\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"supplyRatePerBlock\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyRatePerBlock failed: ${e}`); }),\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"borrowRatePerBlock\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] borrowRatePerBlock failed: ${e}`); }),\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"totalSupply\" }).catch(() => 0n),\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"totalBorrows\" }).catch(() => 0n),\n ]);\n\n const supplyPerBlock = Number(supplyRate) / 1e18;\n const borrowPerBlock = Number(borrowRate) / 1e18;\n const supplyApy = supplyPerBlock * BSC_BLOCKS_PER_YEAR * 100;\n const borrowApy = borrowPerBlock * BSC_BLOCKS_PER_YEAR * 100;\n\n const supplyF = Number(totalSupply);\n const borrowF = Number(totalBorrows);\n const utilization = supplyF > 0 ? (borrowF / supplyF) * 100 : 0;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrows as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] User position requires querying individual vToken balances`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst COMET_ABI = parseAbi([\n \"function getUtilization() external view returns (uint256)\",\n \"function getSupplyRate(uint256 utilization) external view returns (uint64)\",\n \"function getBorrowRate(uint256 utilization) external view returns (uint64)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrow() external view returns (uint256)\",\n \"function supply(address asset, uint256 amount) external\",\n \"function withdraw(address asset, uint256 amount) external\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\nexport class CompoundV3Adapter implements ILending {\n private readonly protocolName: string;\n private readonly comet: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const comet = contracts[\"comet_usdc\"] ?? contracts[\"comet\"] ?? contracts[\"comet_weth\"];\n if (!comet) throw DefiError.contractError(\"Missing 'comet_usdc' or 'comet' address\");\n this.comet = comet;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.comet, amount: params.amount }],\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n // In Compound V3, borrow = withdraw base asset\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n // In Compound V3, repay = supply base asset\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.comet, amount: params.amount }],\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw from Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const utilization = await client.readContract({\n address: this.comet,\n abi: COMET_ABI,\n functionName: \"getUtilization\",\n }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getUtilization failed: ${e}`); });\n\n const [supplyRate, borrowRate, totalSupply, totalBorrow] = await Promise.all([\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"getSupplyRate\", args: [utilization as bigint] }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getSupplyRate failed: ${e}`); }),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"getBorrowRate\", args: [utilization as bigint] }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getBorrowRate failed: ${e}`); }),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"totalSupply\" }).catch(() => 0n),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"totalBorrow\" }).catch(() => 0n),\n ]);\n\n // Comet rates are per-second scaled by 1e18\n const supplyPerSec = Number(supplyRate) / 1e18;\n const borrowPerSec = Number(borrowRate) / 1e18;\n const supplyApy = supplyPerSec * SECONDS_PER_YEAR * 100;\n const borrowApy = borrowPerSec * SECONDS_PER_YEAR * 100;\n const utilPct = Number(utilization as bigint) / 1e18 * 100;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization: utilPct,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrow as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] User position requires querying Comet balanceOf + borrowBalanceOf`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst EULER_VAULT_ABI = parseAbi([\n \"function deposit(uint256 amount, address receiver) external returns (uint256)\",\n \"function withdraw(uint256 amount, address receiver, address owner) external returns (uint256)\",\n \"function borrow(uint256 amount, address receiver) external returns (uint256)\",\n \"function repay(uint256 amount, address receiver) external returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrows() external view returns (uint256)\",\n \"function interestRate() external view returns (uint256)\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\nexport class EulerV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly euler: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const euler = contracts[\"evk_vault\"] ?? contracts[\"euler\"] ?? contracts[\"markets\"];\n if (!euler) throw DefiError.contractError(\"Missing 'evk_vault' or 'euler' contract address\");\n this.euler = euler;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"deposit\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Deposit ${params.amount} into Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"borrow\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"repay\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"withdraw\",\n args: [params.amount, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [totalSupply, totalBorrows, interestRate] = await Promise.all([\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"totalSupply\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`); }),\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"totalBorrows\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalBorrows failed: ${e}`); }),\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"interestRate\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] interestRate failed: ${e}`); }),\n ]);\n\n // Euler V2 interest rates per-second scaled by 1e27\n const rateF64 = Number(interestRate) / 1e27;\n const borrowApy = rateF64 * SECONDS_PER_YEAR * 100;\n\n const supplyF = Number(totalSupply);\n const borrowF = Number(totalBorrows);\n const utilization = supplyF > 0 ? (borrowF / supplyF) * 100 : 0;\n const supplyApy = borrowApy * (borrowF / Math.max(supplyF, 1));\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrows as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Euler V2 user positions require querying individual vault balances. Use the vault address directly to check balanceOf(user) for supply positions.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData, decodeFunctionResult, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n multicallRead,\n decodeU256,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst MORPHO_ABI = parseAbi([\n \"function market(bytes32 id) external view returns (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee)\",\n \"function idToMarketParams(bytes32 id) external view returns (address loanToken, address collateralToken, address oracle, address irm, uint256 lltv)\",\n \"function supply((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, bytes data) external returns (uint256 assetsSupplied, uint256 sharesSupplied)\",\n \"function borrow((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver) external returns (uint256 assetsBorrowed, uint256 sharesBorrowed)\",\n \"function repay((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, bytes data) external returns (uint256 assetsRepaid, uint256 sharesRepaid)\",\n \"function withdraw((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver) external returns (uint256 assetsWithdrawn, uint256 sharesWithdrawn)\",\n]);\n\nconst META_MORPHO_ABI = parseAbi([\n \"function supplyQueueLength() external view returns (uint256)\",\n \"function supplyQueue(uint256 index) external view returns (bytes32)\",\n \"function totalAssets() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nconst ERC4626_ABI = parseAbi([\n \"function asset() external view returns (address)\",\n \"function deposit(uint256 assets, address receiver) external returns (uint256 shares)\",\n \"function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets)\",\n \"function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares)\",\n \"function balanceOf(address owner) external view returns (uint256)\",\n]);\n\nconst MAX_UINT256 = (1n << 256n) - 1n;\n\nconst IRM_ABI = parseAbi([\n \"function borrowRateView((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee) market) external view returns (uint256)\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\ntype MarketParams = {\n loanToken: Address;\n collateralToken: Address;\n oracle: Address;\n irm: Address;\n lltv: bigint;\n};\n\nfunction defaultMarketParams(loanToken: Address = zeroAddress as Address): MarketParams {\n return {\n loanToken,\n collateralToken: zeroAddress as Address,\n oracle: zeroAddress as Address,\n irm: zeroAddress as Address,\n lltv: 0n,\n };\n}\n\nfunction decodeMarket(data: Hex | null): [bigint, bigint, bigint, bigint, bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: MORPHO_ABI,\n functionName: \"market\",\n data,\n }) as [bigint, bigint, bigint, bigint, bigint, bigint];\n } catch {\n return null;\n }\n}\n\nfunction decodeMarketParams(data: Hex | null): [Address, Address, Address, Address, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: MORPHO_ABI,\n functionName: \"idToMarketParams\",\n data,\n }) as [Address, Address, Address, Address, bigint];\n } catch {\n return null;\n }\n}\n\nexport class MorphoBlueAdapter implements ILending {\n private readonly protocolName: string;\n private readonly morpho: Address;\n private readonly defaultVault?: Address;\n private readonly rpcUrl?: string;\n private readonly metaMorphoVaults: Address[];\n private readonly metaMorphoVaultEntries: Array<{ key: string; addr: Address }>;\n private vaultAssetMap: Map<string, Address> | null = null;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const morpho = contracts[\"morpho_blue\"];\n if (!morpho) throw DefiError.contractError(\"Missing 'morpho_blue' contract address\");\n this.morpho = morpho;\n this.defaultVault =\n contracts[\"fehype\"] ?? contracts[\"vault\"] ?? contracts[\"feusdc\"];\n this.metaMorphoVaultEntries = Object.entries(contracts)\n .filter(([key]) => /^fe[a-z0-9_]+$/i.test(key) || key === \"vault\")\n .map(([key, addr]) => ({ key, addr }));\n this.metaMorphoVaults = this.metaMorphoVaultEntries.map((e) => e.addr);\n }\n\n private async resolveVault(asset: Address, preferKey?: string): Promise<Address | null> {\n if (this.metaMorphoVaultEntries.length === 0 || !this.rpcUrl) return null;\n if (preferKey) {\n const direct = this.metaMorphoVaultEntries.find((e) => e.key === preferKey);\n if (direct) return direct.addr;\n }\n if (!this.vaultAssetMap) {\n const calls = this.metaMorphoVaultEntries.map((e) => [\n e.addr,\n encodeFunctionData({ abi: ERC4626_ABI, functionName: \"asset\" }),\n ]) as Array<[Address, Hex]>;\n const results = await multicallRead(this.rpcUrl, calls).catch(() => []);\n const map = new Map<string, { key: string; addr: Address }>();\n for (let i = 0; i < results.length; i++) {\n const data = results[i];\n if (!data || data.length < 66) continue;\n const a = (`0x${data.slice(26, 66)}`).toLowerCase();\n const entry = this.metaMorphoVaultEntries[i] as { key: string; addr: Address };\n const existing = map.get(a);\n // Prefer canonical (shortest key) — avoids feusdt0_frontier silently overwriting feusdt0\n if (!existing || entry.key.length < existing.key.length) {\n map.set(a, entry);\n }\n }\n const flatMap = new Map<string, Address>();\n for (const [k, v] of map) flatMap.set(k, v.addr);\n this.vaultAssetMap = flatMap;\n }\n return this.vaultAssetMap.get(asset.toLowerCase()) ?? null;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const vault = await this.resolveVault(params.asset);\n if (vault) {\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"deposit\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Deposit ${params.amount} into MetaMorpho vault`,\n to: vault,\n data,\n value: 0n,\n gas_estimate: 400_000,\n approvals: [{ token: params.asset, spender: vault, amount: params.amount }],\n };\n }\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"supply\",\n args: [market, params.amount, 0n, params.on_behalf_of, \"0x\"],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"borrow\",\n args: [market, params.amount, 0n, params.on_behalf_of, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"repay\",\n args: [market, params.amount, 0n, params.on_behalf_of, \"0x\"],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const vault = await this.resolveVault(params.asset);\n if (vault) {\n if (params.amount === MAX_UINT256) {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC required to fetch vault shares\");\n const [balRaw] = await multicallRead(this.rpcUrl, [\n [vault, encodeFunctionData({ abi: ERC4626_ABI, functionName: \"balanceOf\", args: [params.to] })],\n ]);\n const shares = decodeU256(balRaw ?? null);\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"redeem\",\n args: [shares, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Redeem all shares (${shares}) from MetaMorpho vault`,\n to: vault, data, value: 0n, gas_estimate: 400_000,\n };\n }\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"withdraw\",\n args: [params.amount, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} assets from MetaMorpho vault`,\n to: vault, data, value: 0n, gas_estimate: 400_000,\n };\n }\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"withdraw\",\n args: [market, params.amount, 0n, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n if (!this.defaultVault) {\n return { protocol: this.protocolName, asset, supply_apy: 0, borrow_variable_apy: 0, borrow_stable_apy: 0, utilization: 0, total_supply: 0n, total_borrow: 0n };\n }\n\n // Batch 1: supplyQueueLength (gate check)\n const [queueLenRaw] = await multicallRead(this.rpcUrl, [\n [this.defaultVault, encodeFunctionData({ abi: META_MORPHO_ABI, functionName: \"supplyQueueLength\" })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyQueueLength failed: ${e}`); });\n\n const queueLen = decodeU256(queueLenRaw ?? null);\n\n if (queueLen === 0n) {\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: 0,\n borrow_variable_apy: 0,\n utilization: 0,\n total_supply: 0n,\n total_borrow: 0n,\n };\n }\n\n // supplyQueue(0) — single call, depends on queueLen > 0\n const [marketIdRaw] = await multicallRead(this.rpcUrl, [\n [this.defaultVault, encodeFunctionData({ abi: META_MORPHO_ABI, functionName: \"supplyQueue\", args: [0n] })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyQueue(0) failed: ${e}`); });\n\n if (!marketIdRaw || marketIdRaw.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] supplyQueue(0) returned no data`);\n }\n const marketId = marketIdRaw.slice(0, 66) as `0x${string}`;\n\n // Batch 2: market + idToMarketParams (both depend on marketId, independent of each other)\n const [marketRaw, paramsRaw] = await multicallRead(this.rpcUrl, [\n [this.morpho, encodeFunctionData({ abi: MORPHO_ABI, functionName: \"market\", args: [marketId] })],\n [this.morpho, encodeFunctionData({ abi: MORPHO_ABI, functionName: \"idToMarketParams\", args: [marketId] })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] market/idToMarketParams failed: ${e}`); });\n\n const mktDecoded = decodeMarket(marketRaw ?? null);\n if (!mktDecoded) throw DefiError.rpcError(`[${this.protocolName}] market() returned no data`);\n const [totalSupplyAssets, totalSupplyShares, totalBorrowAssets, totalBorrowShares, lastUpdate, fee] = mktDecoded;\n\n const paramsDecoded = decodeMarketParams(paramsRaw ?? null);\n if (!paramsDecoded) throw DefiError.rpcError(`[${this.protocolName}] idToMarketParams returned no data`);\n const [loanToken, collateralToken, oracle, irm, lltv] = paramsDecoded;\n\n const supplyF = Number(totalSupplyAssets);\n const borrowF = Number(totalBorrowAssets);\n const util = supplyF > 0 ? borrowF / supplyF : 0;\n\n const irmMarketParams: MarketParams = { loanToken, collateralToken, oracle, irm, lltv };\n const irmMarket = { totalSupplyAssets, totalSupplyShares, totalBorrowAssets, totalBorrowShares, lastUpdate, fee };\n\n // borrowRateView depends on both market + idToMarketParams results — keep separate\n const borrowRatePerSec = await (async () => {\n const [borrowRateRaw] = await multicallRead(this.rpcUrl!, [\n [irm, encodeFunctionData({ abi: IRM_ABI, functionName: \"borrowRateView\", args: [irmMarketParams, irmMarket] })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] borrowRateView failed: ${e}`); });\n return decodeU256(borrowRateRaw ?? null);\n })();\n\n const ratePerSec = Number(borrowRatePerSec) / 1e18;\n const borrowApy = ratePerSec * SECONDS_PER_YEAR * 100;\n const feePct = Number(fee) / 1e18;\n const supplyApy = borrowApy * util * (1 - feePct);\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization: util * 100,\n total_supply: totalSupplyAssets,\n total_borrow: totalBorrowAssets,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Morpho Blue user positions are per-market — use vault deposit/withdraw instead`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ICdp } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OpenCdpParams,\n type AdjustCdpParams,\n type CloseCdpParams,\n type CdpInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst BORROWER_OPS_ABI = parseAbi([\n \"function openTrove(address _owner, uint256 _ownerIndex, uint256 _collAmount, uint256 _boldAmount, uint256 _upperHint, uint256 _lowerHint, uint256 _annualInterestRate, uint256 _maxUpfrontFee, address _addManager, address _removeManager, address _receiver) external returns (uint256)\",\n \"function adjustTrove(uint256 _troveId, uint256 _collChange, bool _isCollIncrease, uint256 _debtChange, bool _isDebtIncrease, uint256 _upperHint, uint256 _lowerHint, uint256 _maxUpfrontFee) external\",\n \"function closeTrove(uint256 _troveId) external\",\n]);\n\nconst TROVE_MANAGER_ABI = parseAbi([\n \"function getLatestTroveData(uint256 _troveId) external view returns (uint256 entireDebt, uint256 entireColl, uint256 redistDebtGain, uint256 redistCollGain, uint256 accruedInterest, uint256 recordedDebt, uint256 annualInterestRate, uint256 accruedBatchManagementFee, uint256 weightedRecordedDebt, uint256 lastInterestRateAdjTime)\",\n]);\n\nconst HINT_HELPERS_ABI = parseAbi([\n \"function getApproxHint(uint256 _collIndex, uint256 _interestRate, uint256 _numTrials, uint256 _inputRandomSeed) external view returns (uint256 hintId, uint256 diff, uint256 latestRandomSeed)\",\n]);\n\nconst SORTED_TROVES_ABI = parseAbi([\n \"function findInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external view returns (uint256 prevId, uint256 nextId)\",\n]);\n\nexport class FelixCdpAdapter implements ICdp {\n private readonly protocolName: string;\n private readonly borrowerOperations: Address;\n private readonly troveManager?: Address;\n private readonly hintHelpers?: Address;\n private readonly sortedTroves?: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const bo = contracts[\"borrower_operations\"];\n if (!bo) throw DefiError.contractError(\"Missing 'borrower_operations' contract\");\n this.borrowerOperations = bo;\n this.troveManager = contracts[\"trove_manager\"];\n this.hintHelpers = contracts[\"hint_helpers\"];\n this.sortedTroves = contracts[\"sorted_troves\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n private async getHints(interestRate: bigint): Promise<[bigint, bigint]> {\n if (!this.hintHelpers || !this.sortedTroves || !this.rpcUrl) {\n return [0n, 0n];\n }\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const approxResult = await client.readContract({\n address: this.hintHelpers,\n abi: HINT_HELPERS_ABI,\n functionName: \"getApproxHint\",\n args: [0n, interestRate, 15n, 42n],\n }).catch(() => null);\n\n if (!approxResult) return [0n, 0n];\n const [hintId] = approxResult as [bigint, bigint, bigint];\n\n const insertResult = await client.readContract({\n address: this.sortedTroves,\n abi: SORTED_TROVES_ABI,\n functionName: \"findInsertPosition\",\n args: [interestRate, hintId, hintId],\n }).catch(() => null);\n\n if (!insertResult) return [0n, 0n];\n const [prevId, nextId] = insertResult as [bigint, bigint];\n return [prevId, nextId];\n }\n\n async buildOpen(params: OpenCdpParams): Promise<DeFiTx> {\n const interestRate = 50000000000000000n; // 5% default\n const [upperHint, lowerHint] = await this.getHints(interestRate);\n const hasHints = upperHint !== 0n || lowerHint !== 0n;\n\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"openTrove\",\n args: [\n params.recipient,\n 0n,\n params.collateral_amount,\n params.debt_amount,\n upperHint,\n lowerHint,\n interestRate,\n BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"), // U256::MAX\n params.recipient,\n params.recipient,\n params.recipient,\n ],\n });\n\n return {\n description: `[${this.protocolName}] Open trove: collateral=${params.collateral_amount}, debt=${params.debt_amount} (hints=${hasHints ? \"optimized\" : \"none\"})`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: hasHints ? 500_000 : 5_000_000,\n };\n }\n\n async buildAdjust(params: AdjustCdpParams): Promise<DeFiTx> {\n const collChange = params.collateral_delta ?? 0n;\n const debtChange = params.debt_delta ?? 0n;\n\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"adjustTrove\",\n args: [\n params.cdp_id,\n collChange,\n params.add_collateral,\n debtChange,\n params.add_debt,\n 0n,\n 0n,\n BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Adjust trove ${params.cdp_id}`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n async buildClose(params: CloseCdpParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"closeTrove\",\n args: [params.cdp_id],\n });\n\n return {\n description: `[${this.protocolName}] Close trove ${params.cdp_id}`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async getCdpInfo(cdpId: bigint): Promise<CdpInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(`[${this.protocolName}] getCdpInfo requires RPC — set HYPEREVM_RPC_URL`);\n if (!this.troveManager) throw DefiError.contractError(`[${this.protocolName}] trove_manager contract not configured`);\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const data = await client.readContract({\n address: this.troveManager,\n abi: TROVE_MANAGER_ABI,\n functionName: \"getLatestTroveData\",\n args: [cdpId],\n }).catch((e: unknown) => {\n throw DefiError.invalidParam(`[${this.protocolName}] Trove ${cdpId} not found: ${e}`);\n });\n\n const [entireDebt, entireColl] = data as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint];\n\n if (entireDebt === 0n && entireColl === 0n) {\n throw DefiError.invalidParam(`[${this.protocolName}] Trove ${cdpId} does not exist`);\n }\n\n const collRatio = entireDebt > 0n ? Number(entireColl) / Number(entireDebt) : 0;\n\n return {\n protocol: this.protocolName,\n cdp_id: cdpId,\n collateral: {\n token: zeroAddress as Address,\n symbol: \"WHYPE\",\n amount: entireColl,\n decimals: 18,\n },\n debt: {\n token: zeroAddress as Address,\n symbol: \"feUSD\",\n amount: entireDebt,\n decimals: 18,\n },\n collateral_ratio: collRatio,\n };\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry, type PriceData } from \"@hypurrquant/defi-core\";\n\nconst PRICE_FEED_ABI = parseAbi([\n \"function fetchPrice() external view returns (uint256 price, bool isNewOracleFailureDetected)\",\n \"function lastGoodPrice() external view returns (uint256)\",\n]);\n\nexport class FelixOracleAdapter implements IOracle {\n private readonly protocolName: string;\n private readonly priceFeed: Address;\n private readonly asset: Address;\n private readonly rpcUrl: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!rpcUrl) throw DefiError.rpcError(`[${entry.name}] RPC URL required for oracle`);\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const feed = contracts[\"price_feed\"];\n if (!feed) throw DefiError.contractError(`[${entry.name}] Missing 'price_feed' contract address`);\n this.priceFeed = feed;\n // The asset address is stored under \"asset\" or falls back to zero (WHYPE native)\n this.asset = contracts[\"asset\"] ?? (\"0x0000000000000000000000000000000000000000\" as Address);\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getPrice(asset: Address): Promise<PriceData> {\n if (asset !== this.asset && this.asset !== \"0x0000000000000000000000000000000000000000\") {\n throw DefiError.unsupported(`[${this.protocolName}] Felix PriceFeed only supports asset ${this.asset}`);\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n let priceVal: bigint;\n try {\n const result = await client.readContract({\n address: this.priceFeed,\n abi: PRICE_FEED_ABI,\n functionName: \"fetchPrice\",\n });\n const [price] = result as [bigint, boolean];\n priceVal = price;\n } catch {\n // Fall back to lastGoodPrice\n priceVal = await client.readContract({\n address: this.priceFeed,\n abi: PRICE_FEED_ABI,\n functionName: \"lastGoodPrice\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] lastGoodPrice failed: ${e}`);\n }) as bigint;\n }\n\n // Felix prices are already in 18-decimal USD\n const priceF64 = Number(priceVal) / 1e18;\n\n return {\n source: \"Felix PriceFeed\",\n source_type: \"oracle\",\n asset,\n price_usd: priceVal,\n price_f64: priceF64,\n };\n }\n\n async getPrices(assets: Address[]): Promise<PriceData[]> {\n const results: PriceData[] = [];\n for (const asset of assets) {\n try {\n results.push(await this.getPrice(asset));\n } catch {\n // Skip unsupported assets\n }\n }\n return results;\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IVault } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type VaultInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst ERC4626_ABI = parseAbi([\n \"function asset() external view returns (address)\",\n \"function totalAssets() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function convertToShares(uint256 assets) external view returns (uint256)\",\n \"function convertToAssets(uint256 shares) external view returns (uint256)\",\n \"function deposit(uint256 assets, address receiver) external returns (uint256 shares)\",\n \"function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares)\",\n]);\n\nexport class ERC4626VaultAdapter implements IVault {\n private readonly protocolName: string;\n private readonly vaultAddress: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const vault = entry.contracts?.[\"vault\"];\n if (!vault) throw DefiError.contractError(\"Missing 'vault' contract address\");\n this.vaultAddress = vault;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildDeposit(assets: bigint, receiver: Address): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"deposit\",\n args: [assets, receiver],\n });\n return {\n description: `[${this.protocolName}] Deposit ${assets} assets into vault`,\n to: this.vaultAddress,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildWithdraw(assets: bigint, receiver: Address, owner: Address): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"withdraw\",\n args: [assets, receiver, owner],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${assets} assets from vault`,\n to: this.vaultAddress,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async totalAssets(): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"totalAssets\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalAssets failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async convertToShares(assets: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"convertToShares\",\n args: [assets],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] convertToShares failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async convertToAssets(shares: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"convertToAssets\",\n args: [shares],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] convertToAssets failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async getVaultInfo(): Promise<VaultInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [totalAssets, totalSupply, asset] = await Promise.all([\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"totalAssets\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalAssets failed: ${e}`); }),\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"totalSupply\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`); }),\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"asset\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] asset failed: ${e}`); }),\n ]);\n\n return {\n protocol: this.protocolName,\n vault_address: this.vaultAddress,\n asset: asset as Address,\n total_assets: totalAssets as bigint,\n total_supply: totalSupply as bigint,\n };\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst GENERIC_LST_ABI = parseAbi([\n \"function stake() external payable returns (uint256)\",\n \"function unstake(uint256 amount) external returns (uint256)\",\n]);\n\nexport class GenericLstAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract\");\n this.staking = staking;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({ abi: GENERIC_LST_ABI, functionName: \"stake\" });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 200_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: GENERIC_LST_ABI,\n functionName: \"unstake\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Unstake ${params.amount}`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n throw DefiError.unsupported(`[${this.protocolName}] getInfo requires RPC`);\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst STHYPE_ABI = parseAbi([\n \"function submit(address referral) external payable returns (uint256)\",\n \"function requestWithdrawals(uint256[] amounts, address owner) external returns (uint256[] requestIds)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nexport class StHypeAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n private readonly sthypeToken?: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract\");\n this.staking = staking;\n this.sthypeToken = entry.contracts?.[\"sthype_token\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: STHYPE_ABI,\n functionName: \"submit\",\n args: [zeroAddress as Address],\n });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE for stHYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 200_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: STHYPE_ABI,\n functionName: \"requestWithdrawals\",\n args: [[params.amount], params.recipient],\n });\n return {\n description: `[${this.protocolName}] Request unstake ${params.amount} stHYPE`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const tokenAddr = this.sthypeToken ?? this.staking;\n\n const totalSupply = await client.readContract({\n address: tokenAddr,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`);\n }) as bigint;\n\n return {\n protocol: this.protocolName,\n staked_token: zeroAddress as Address,\n liquid_token: tokenAddr,\n exchange_rate: 1.0,\n total_staked: totalSupply,\n };\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst KINETIQ_ABI = parseAbi([\n \"function stake() external payable returns (uint256)\",\n \"function requestUnstake(uint256 amount) external returns (uint256)\",\n \"function totalStaked() external view returns (uint256)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n]);\n\n// WHYPE address on HyperEVM\nconst WHYPE: Address = \"0x5555555555555555555555555555555555555555\";\n// HyperLend oracle address (Aave V3 compatible)\nconst HYPERLEND_ORACLE: Address = \"0xc9fb4fbe842d57ea1df3e641a281827493a63030\";\n\nexport class KinetiqAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n private readonly liquidToken: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract address\");\n this.staking = staking;\n this.liquidToken = entry.contracts?.[\"khype_token\"] ?? staking;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({ abi: KINETIQ_ABI, functionName: \"stake\" });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE for kHYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 300_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: KINETIQ_ABI,\n functionName: \"requestUnstake\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Request unstake ${params.amount} kHYPE`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const totalStaked = await client.readContract({\n address: this.staking,\n abi: KINETIQ_ABI,\n functionName: \"totalStaked\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalStaked failed: ${e}`);\n }) as bigint;\n\n const [khypePrice, hypePrice] = await Promise.all([\n client.readContract({ address: HYPERLEND_ORACLE, abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [this.liquidToken] }).catch(() => 0n),\n client.readContract({ address: HYPERLEND_ORACLE, abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [WHYPE] }).catch(() => 0n),\n ]);\n\n const rateF64 =\n (hypePrice as bigint) > 0n && (khypePrice as bigint) > 0n\n ? Number((khypePrice as bigint) * 10n ** 18n / (hypePrice as bigint)) / 1e18\n : 1.0;\n\n return {\n protocol: this.protocolName,\n staked_token: zeroAddress as Address,\n liquid_token: this.liquidToken,\n exchange_rate: rateF64,\n total_staked: totalStaked,\n };\n }\n}\n","import type { Address } from \"viem\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type YieldInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class PendleAdapter implements IYieldSource {\n private readonly protocolName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!entry.contracts?.[\"router\"]) {\n throw DefiError.contractError(\"Missing 'router' contract\");\n }\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getYields(): Promise<YieldInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] getYields requires RPC`);\n }\n\n async buildDeposit(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Pendle deposit requires market address and token routing params. Use Pendle-specific CLI.`,\n );\n }\n\n async buildWithdraw(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Pendle withdraw requires market-specific params`,\n );\n }\n}\n","import type { Address } from \"viem\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type YieldInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericYieldAdapter implements IYieldSource {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getYields(): Promise<YieldInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] getYields requires RPC`);\n }\n\n async buildDeposit(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Yield interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'pendle_v2' (Pendle). Protocols like Steer (managed liquidity), ` +\n `Liminal (yield optimization), and Altura (gaming yield) need custom deposit logic.`,\n );\n }\n\n async buildWithdraw(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Yield interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'pendle_v2' (Pendle). Protocols like Steer (managed liquidity), ` +\n `Liminal (yield optimization), and Altura (gaming yield) need custom withdraw logic.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type DerivativesPositionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\n\nconst HLP_ABI = parseAbi([\n \"function deposit(uint256 amount) external returns (uint256)\",\n \"function withdraw(uint256 shares) external returns (uint256)\",\n]);\n\nexport class HlpVaultAdapter implements IDerivatives {\n private readonly protocolName: string;\n private readonly vault: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const vault = entry.contracts?.[\"vault\"];\n if (!vault) throw DefiError.contractError(\"Missing 'vault' contract\");\n this.vault = vault;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildOpenPosition(params: DerivativesPositionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: HLP_ABI,\n functionName: \"deposit\",\n args: [params.collateral],\n });\n return {\n description: `[${this.protocolName}] Deposit ${params.collateral} into HLP vault`,\n to: this.vault,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildClosePosition(params: DerivativesPositionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: HLP_ABI,\n functionName: \"withdraw\",\n args: [params.size],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.size} from HLP vault`,\n to: this.vault,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n}\n","import type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type DerivativesPositionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericDerivativesAdapter implements IDerivatives {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildOpenPosition(_params: DerivativesPositionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Derivatives interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'hlp_vault' (HLP Vault). Protocols like Rumpel need custom position management logic.`,\n );\n }\n\n async buildClosePosition(_params: DerivativesPositionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Derivatives interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'hlp_vault' (HLP Vault). Protocols like Rumpel need custom position management logic.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOptions } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OptionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst RYSK_ABI = parseAbi([\n \"function openOption(address underlying, uint256 strikePrice, uint256 expiry, bool isCall, uint256 amount) external returns (uint256 premium)\",\n \"function closeOption(address underlying, uint256 strikePrice, uint256 expiry, bool isCall, uint256 amount) external returns (uint256 payout)\",\n]);\n\nexport class RyskAdapter implements IOptions {\n private readonly protocolName: string;\n private readonly controller: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const controller = entry.contracts?.[\"controller\"];\n if (!controller) throw DefiError.contractError(\"Missing 'controller' contract\");\n this.controller = controller;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildBuy(params: OptionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: RYSK_ABI,\n functionName: \"openOption\",\n args: [\n params.underlying,\n params.strike_price,\n BigInt(params.expiry),\n params.is_call,\n params.amount,\n ],\n });\n return {\n description: `[${this.protocolName}] Buy ${params.is_call ? \"call\" : \"put\"} ${params.amount} option, strike=${params.strike_price}, expiry=${params.expiry}`,\n to: this.controller,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildSell(params: OptionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: RYSK_ABI,\n functionName: \"closeOption\",\n args: [\n params.underlying,\n params.strike_price,\n BigInt(params.expiry),\n params.is_call,\n params.amount,\n ],\n });\n return {\n description: `[${this.protocolName}] Sell/close ${params.is_call ? \"call\" : \"put\"} ${params.amount} option`,\n to: this.controller,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import type { IOptions } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OptionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericOptionsAdapter implements IOptions {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildBuy(_params: OptionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Options interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'rysk' (Rysk Finance). Other options protocols need custom strike/expiry handling.`,\n );\n }\n\n async buildSell(_params: OptionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Options interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'rysk' (Rysk Finance). Other options protocols need custom strike/expiry handling.`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { INft, NftCollectionInfo, NftTokenInfo } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry } from \"@hypurrquant/defi-core\";\n\nconst ERC721_ABI = parseAbi([\n \"function name() returns (string)\",\n \"function symbol() returns (string)\",\n \"function totalSupply() returns (uint256)\",\n \"function ownerOf(uint256 tokenId) returns (address)\",\n \"function balanceOf(address owner) returns (uint256)\",\n \"function tokenURI(uint256 tokenId) returns (string)\",\n]);\n\nexport class ERC721Adapter implements INft {\n private readonly protocolName: string;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getCollectionInfo(collection: Address): Promise<NftCollectionInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [collectionName, symbol, totalSupply] = await Promise.all([\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"name\" })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] name failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"symbol\" })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] symbol failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"totalSupply\" })\n .catch(() => undefined),\n ]);\n\n return {\n address: collection,\n name: collectionName as string,\n symbol: symbol as string,\n total_supply: totalSupply as bigint | undefined,\n };\n }\n\n async getTokenInfo(collection: Address, tokenId: bigint): Promise<NftTokenInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [owner, tokenUri] = await Promise.all([\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"ownerOf\", args: [tokenId] })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] ownerOf failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"tokenURI\", args: [tokenId] })\n .catch(() => undefined),\n ]);\n\n return {\n collection,\n token_id: tokenId,\n owner: owner as Address,\n token_uri: tokenUri as string | undefined,\n };\n }\n\n async getBalance(owner: Address, collection: Address): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n return client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"balanceOf\", args: [owner] })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] balanceOf failed: ${e}`);\n }) as Promise<bigint>;\n }\n}\n","import type { Address } from \"viem\";\n\nimport type { IDex, PriceData, QuoteParams } from \"@hypurrquant/defi-core\";\n\n/**\n * Utility for deriving spot prices from DEX quoters.\n * Quotes 1 unit of the token against a quote token (e.g. USDC) to derive price.\n */\nexport class DexSpotPrice {\n /**\n * Get the spot price for `token` denominated in `quoteToken` (e.g. USDC).\n *\n * `tokenDecimals` — decimals of the input token (to know how much \"1 unit\" is)\n * `quoteDecimals` — decimals of the quote token (to convert the output to number)\n */\n static async getPrice(\n dex: IDex,\n token: Address,\n tokenDecimals: number,\n quoteToken: Address,\n quoteDecimals: number,\n ): Promise<PriceData> {\n const amountIn = 10n ** BigInt(tokenDecimals); // 1 token\n\n const quoteParams: QuoteParams = {\n protocol: \"\",\n token_in: token,\n token_out: quoteToken,\n amount_in: amountIn,\n };\n\n const quote = await dex.quote(quoteParams);\n\n // Convert to USD price (assuming quoteToken is a USD stablecoin)\n const priceF64 = Number(quote.amount_out) / 10 ** quoteDecimals;\n\n // Normalize to 18-decimal representation\n let priceUsd: bigint;\n if (quoteDecimals < 18) {\n priceUsd = quote.amount_out * 10n ** BigInt(18 - quoteDecimals);\n } else if (quoteDecimals > 18) {\n priceUsd = quote.amount_out / 10n ** BigInt(quoteDecimals - 18);\n } else {\n priceUsd = quote.amount_out;\n }\n\n return {\n source: `dex:${dex.name()}`,\n source_type: \"dex_spot\",\n asset: token,\n price_usd: priceUsd,\n price_f64: priceF64,\n block_number: undefined,\n timestamp: undefined,\n };\n }\n}\n","import { Command } from \"commander\";\nimport { createRequire } from \"node:module\";\nimport { Executor } from \"./executor.js\";\nimport { parseOutputMode } from \"./output.js\";\nimport type { OutputMode } from \"./output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\n\nconst _require = createRequire(import.meta.url);\nconst _pkg = _require(\"../package.json\") as { version: string };\n\nimport { registerStatus } from \"./commands/status.js\";\nimport { registerSchema } from \"./commands/schema.js\";\nimport { registerLP } from \"./commands/lp.js\";\nimport { registerLending } from \"./commands/lending.js\";\nimport { registerYield } from \"./commands/yield.js\";\nimport { registerPortfolio } from \"./commands/portfolio.js\";\nimport { registerPrice } from \"./commands/price.js\";\nimport { registerWallet } from \"./commands/wallet.js\";\nimport { registerToken } from \"./commands/token.js\";\nimport { registerBridge } from \"./commands/bridge.js\";\nimport { registerSwap } from \"./commands/swap.js\";\nimport { registerSetup } from \"./commands/setup.js\";\nimport { registerOws } from \"./commands/ows.js\";\n\nconst BANNER = `\n ██████╗ ███████╗███████╗██╗ ██████╗██╗ ██╗\n ██╔══██╗██╔════╝██╔════╝██║ ██╔════╝██║ ██║\n ██║ ██║█████╗ █████╗ ██║ ██║ ██║ ██║\n ██║ ██║██╔══╝ ██╔══╝ ██║ ██║ ██║ ██║\n ██████╔╝███████╗██║ ██║ ╚██████╗███████╗██║\n ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝╚══════╝╚═╝\n\n 2 chains · 21 protocols · by HypurrQuant\n\n Lending, LP farming, DEX swap, yield comparison\n — all from your terminal.\n`;\n\nexport const program = new Command()\n .name(\"defi\")\n .description(\"DeFi CLI — Multi-chain DeFi toolkit\")\n .version(_pkg.version)\n .addHelpText(\"before\", BANNER)\n .option(\"--json\", \"Output as JSON\")\n .option(\"--ndjson\", \"Output as newline-delimited JSON\")\n .option(\"--fields <fields>\", \"Select specific output fields (comma-separated)\")\n .option(\"--chain <chain>\", \"Target chain\")\n .option(\"--dry-run\", \"Dry-run mode (default, no broadcast)\", true)\n .option(\"--broadcast\", \"Actually broadcast the transaction\");\n\n// Helper: read global output mode from the root program options\nfunction getOutputMode(): OutputMode {\n const opts = program.opts<{\n json?: boolean;\n ndjson?: boolean;\n fields?: string;\n }>();\n return parseOutputMode(opts);\n}\n\n// Build executor from global options (lazy — must be called inside action handler, not at registration)\nfunction makeExecutor(): Executor {\n const opts = program.opts<{ broadcast?: boolean; chain?: string }>();\n const registry = Registry.loadEmbedded();\n if (!opts.chain) {\n process.stderr.write(\"Error: --chain is required for this command (e.g. --chain hyperevm)\\n\");\n process.exit(1);\n }\n const chain = registry.getChain(opts.chain);\n return new Executor(!!opts.broadcast, chain.effectiveRpcUrl(), chain.explorer_url);\n}\n\n// Register all commands\nregisterStatus(program, getOutputMode);\nregisterSchema(program, getOutputMode);\nregisterLP(program, getOutputMode, makeExecutor);\nregisterLending(program, getOutputMode, makeExecutor);\nregisterYield(program, getOutputMode, makeExecutor);\nregisterPortfolio(program, getOutputMode);\nregisterPrice(program, getOutputMode);\nregisterWallet(program, getOutputMode);\nregisterToken(program, getOutputMode, makeExecutor);\nregisterBridge(program, getOutputMode);\nregisterSwap(program, getOutputMode, makeExecutor);\nregisterSetup(program);\nregisterOws(program, getOutputMode);\n","import { createPublicClient, createWalletClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport { TxStatus } from \"@hypurrquant/defi-core\";\nimport type { ActionResult, DeFiTx } from \"@hypurrquant/defi-core\";\n\nconst ERC20_ABI = parseAbi([\n \"function allowance(address owner, address spender) external view returns (uint256)\",\n \"function approve(address spender, uint256 amount) external returns (bool)\",\n]);\n\n/** Gas buffer multiplier: 120% over estimated gas (20% headroom) */\nconst GAS_BUFFER_BPS = 12000n;\n\n/** Default max priority fee (tip) in wei — 20 gwei (safe for Mantle + EVM chains) */\nconst DEFAULT_PRIORITY_FEE_WEI = 20_000_000_000n;\n\n/** Max gas limit cap — Mantle uses high gas units (up to 5B for complex txs) */\nconst MAX_GAS_LIMIT = 5_000_000_000n; // 5B\n\nexport class Executor {\n readonly dryRun: boolean;\n readonly rpcUrl: string | undefined;\n readonly explorerUrl: string | undefined;\n\n constructor(broadcast: boolean, rpcUrl?: string, explorerUrl?: string) {\n this.dryRun = !broadcast;\n this.rpcUrl = rpcUrl;\n this.explorerUrl = explorerUrl;\n }\n\n /** Apply 20% buffer to a gas estimate */\n private static applyGasBuffer(gas: bigint): bigint {\n return (gas * GAS_BUFFER_BPS) / 10000n;\n }\n\n /**\n * Check allowance for a single token/spender pair and send an approve tx if needed.\n * Only called in broadcast mode (not dry-run).\n */\n private async checkAndApprove(\n token: Address,\n spender: Address,\n amount: bigint,\n owner: Address,\n publicClient: ReturnType<typeof createPublicClient>,\n walletClient: ReturnType<typeof createWalletClient>,\n ): Promise<void> {\n const allowance = await publicClient.readContract({\n address: token,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [owner, spender],\n });\n\n if (allowance >= amount) return;\n\n process.stderr.write(\n ` Approving ${amount} of ${token} for ${spender}...\\n`,\n );\n\n const approveData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [spender, amount],\n });\n\n const rpcUrl = this.rpcUrl!;\n const gasLimit = await (async () => {\n try {\n const estimated = await publicClient.estimateGas({\n to: token,\n data: approveData,\n account: owner,\n });\n const buffered = Executor.applyGasBuffer(estimated);\n return buffered > MAX_GAS_LIMIT ? MAX_GAS_LIMIT : buffered;\n } catch {\n return 80_000n;\n }\n })();\n\n const [maxFeePerGas, maxPriorityFeePerGas] = await this.fetchEip1559Fees(rpcUrl);\n\n const approveTxHash = await walletClient.sendTransaction({\n chain: null,\n account: walletClient.account!,\n to: token,\n data: approveData,\n gas: gasLimit > 0n ? gasLimit : undefined,\n maxFeePerGas: maxFeePerGas > 0n ? maxFeePerGas : undefined,\n maxPriorityFeePerGas: maxPriorityFeePerGas > 0n ? maxPriorityFeePerGas : undefined,\n });\n\n const approveTxUrl = this.explorerUrl\n ? `${this.explorerUrl}/tx/${approveTxHash}`\n : undefined;\n process.stderr.write(` Approve tx: ${approveTxHash}\\n`);\n if (approveTxUrl) process.stderr.write(` Explorer: ${approveTxUrl}\\n`);\n\n await publicClient.waitForTransactionReceipt({ hash: approveTxHash });\n process.stderr.write(\n ` Approved ${amount} of ${token} for ${spender}\\n`,\n );\n }\n\n /** Fetch EIP-1559 fee params from the network. Returns [maxFeePerGas, maxPriorityFeePerGas]. */\n private async fetchEip1559Fees(rpcUrl: string): Promise<[bigint, bigint]> {\n try {\n const client = createPublicClient({ transport: http(rpcUrl) });\n const gasPrice = await client.getGasPrice();\n let priorityFee = DEFAULT_PRIORITY_FEE_WEI;\n try {\n priorityFee = await client.estimateMaxPriorityFeePerGas();\n } catch {\n // fallback to default\n }\n const maxFee = gasPrice * 2n + priorityFee;\n return [maxFee, priorityFee];\n } catch {\n return [0n, 0n];\n }\n }\n\n /** Estimate gas dynamically with buffer, falling back to a hardcoded estimate */\n private async estimateGasWithBuffer(\n rpcUrl: string,\n tx: DeFiTx,\n from: `0x${string}`,\n ): Promise<bigint> {\n try {\n const client = createPublicClient({ transport: http(rpcUrl) });\n const estimated = await client.estimateGas({\n to: tx.to,\n data: tx.data,\n value: tx.value,\n account: from,\n });\n if (estimated > 0n) {\n const buffered = Executor.applyGasBuffer(estimated);\n return buffered > MAX_GAS_LIMIT ? MAX_GAS_LIMIT : buffered;\n }\n } catch {\n // fallback: apply buffer to the hint too\n if (tx.gas_estimate) {\n return Executor.applyGasBuffer(BigInt(tx.gas_estimate));\n }\n }\n return 0n;\n }\n\n /** Simulate a transaction via eth_call + eth_estimateGas */\n private async simulate(tx: DeFiTx): Promise<ActionResult> {\n const rpcUrl = this.rpcUrl;\n if (!rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL — cannot simulate. Set HYPEREVM_RPC_URL.\");\n }\n\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const privateKey = process.env[\"DEFI_PRIVATE_KEY\"];\n const from: `0x${string}` = privateKey\n ? privateKeyToAccount(privateKey as `0x${string}`).address\n : \"0x0000000000000000000000000000000000000001\";\n\n // Check approvals before simulation\n if (tx.approvals && tx.approvals.length > 0) {\n const pendingApprovals: Array<{ token: string; spender: string; needed: string; current: string }> = [];\n for (const approval of tx.approvals) {\n try {\n const allowance = await client.readContract({\n address: approval.token,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [from as `0x${string}`, approval.spender],\n });\n if (allowance < approval.amount) {\n pendingApprovals.push({\n token: approval.token,\n spender: approval.spender,\n needed: approval.amount.toString(),\n current: allowance.toString(),\n });\n }\n } catch { /* skip check on error */ }\n }\n if (pendingApprovals.length > 0) {\n return {\n tx_hash: undefined,\n status: TxStatus.NeedsApproval,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"simulated\",\n result: \"needs_approval\",\n pending_approvals: pendingApprovals,\n hint: \"Use --broadcast to auto-approve and execute\",\n },\n };\n }\n }\n\n try {\n await client.call({ to: tx.to, data: tx.data, value: tx.value, account: from });\n\n const gasEstimate = await this.estimateGasWithBuffer(rpcUrl, tx, from);\n const [maxFee, priorityFee] = await this.fetchEip1559Fees(rpcUrl);\n\n return {\n tx_hash: undefined,\n status: TxStatus.Simulated,\n gas_used: gasEstimate > 0n ? Number(gasEstimate) : undefined,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n gas_estimate: gasEstimate.toString(),\n max_fee_per_gas_gwei: (Number(maxFee) / 1e9).toFixed(4),\n max_priority_fee_gwei: (Number(priorityFee) / 1e9).toFixed(4),\n mode: \"simulated\",\n result: \"success\",\n },\n };\n } catch (e: unknown) {\n const errMsg = String(e);\n const revertReason = extractRevertReason(errMsg);\n\n return {\n tx_hash: undefined,\n status: TxStatus.SimulationFailed,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"simulated\",\n result: \"revert\",\n revert_reason: revertReason,\n },\n };\n }\n }\n\n async execute(tx: DeFiTx): Promise<ActionResult> {\n if (this.dryRun) {\n if (this.rpcUrl) {\n return this.simulate(tx);\n }\n\n return {\n tx_hash: undefined,\n status: TxStatus.DryRun,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"dry_run\",\n },\n };\n }\n\n // === Broadcast mode ===\n const privateKey = process.env[\"DEFI_PRIVATE_KEY\"];\n if (!privateKey) {\n throw DefiError.invalidParam(\n \"DEFI_PRIVATE_KEY environment variable not set. Required for --broadcast.\",\n );\n }\n\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n\n const rpcUrl = this.rpcUrl;\n if (!rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured for broadcasting\");\n }\n\n const publicClient = createPublicClient({ transport: http(rpcUrl) });\n const walletClient = createWalletClient({ account, transport: http(rpcUrl) });\n\n // Execute pre-transactions (e.g. farming approval)\n if (tx.pre_txs && tx.pre_txs.length > 0) {\n for (const preTx of tx.pre_txs) {\n process.stderr.write(` Pre-tx: ${preTx.description}...\\n`);\n const preGas = await this.estimateGasWithBuffer(rpcUrl, preTx, account.address);\n const preTxHash = await walletClient.sendTransaction({\n chain: null,\n to: preTx.to,\n data: preTx.data,\n value: preTx.value,\n gas: preGas > 0n ? preGas : undefined,\n });\n const preTxUrl = this.explorerUrl ? `${this.explorerUrl}/tx/${preTxHash}` : undefined;\n process.stderr.write(` Pre-tx sent: ${preTxHash}\\n`);\n if (preTxUrl) process.stderr.write(` Explorer: ${preTxUrl}\\n`);\n const preReceipt = await publicClient.waitForTransactionReceipt({ hash: preTxHash });\n if (preReceipt.status !== \"success\") {\n throw new DefiError(\"TX_FAILED\", `Pre-transaction failed: ${preTx.description}`);\n }\n process.stderr.write(` Pre-tx confirmed\\n`);\n }\n }\n\n // Auto-approve ERC20 tokens if needed\n if (tx.approvals && tx.approvals.length > 0) {\n for (const approval of tx.approvals) {\n await this.checkAndApprove(\n approval.token,\n approval.spender,\n approval.amount,\n account.address,\n publicClient,\n walletClient,\n );\n }\n }\n\n // Dynamic gas estimation with buffer\n const gasLimit = await this.estimateGasWithBuffer(rpcUrl, tx, account.address);\n\n // EIP-1559 gas pricing\n const [maxFeePerGas, maxPriorityFeePerGas] = await this.fetchEip1559Fees(rpcUrl);\n\n process.stderr.write(`Broadcasting transaction to ${rpcUrl}...\\n`);\n if (gasLimit > 0n) {\n process.stderr.write(` Gas limit: ${gasLimit} (with 20% buffer)\\n`);\n }\n\n const txHash = await walletClient.sendTransaction({\n chain: null,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n gas: gasLimit > 0n ? gasLimit : undefined,\n maxFeePerGas: maxFeePerGas > 0n ? maxFeePerGas : undefined,\n maxPriorityFeePerGas: maxPriorityFeePerGas > 0n ? maxPriorityFeePerGas : undefined,\n });\n\n const txUrl = this.explorerUrl ? `${this.explorerUrl}/tx/${txHash}` : undefined;\n process.stderr.write(`Transaction sent: ${txHash}\\n`);\n if (txUrl) process.stderr.write(`Explorer: ${txUrl}\\n`);\n process.stderr.write(\"Waiting for confirmation...\\n\");\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n const status = receipt.status === \"success\" ? TxStatus.Confirmed : TxStatus.Failed;\n\n // Extract minted NFT tokenId from Transfer(from=0x0) events\n let mintedTokenId: string | undefined;\n if (receipt.status === \"success\" && receipt.logs) {\n const TRANSFER_TOPIC = \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\";\n const ZERO_TOPIC = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n for (const log of receipt.logs) {\n if (\n log.topics.length >= 4 &&\n log.topics[0] === TRANSFER_TOPIC &&\n log.topics[1] === ZERO_TOPIC // from = address(0) → mint\n ) {\n mintedTokenId = BigInt(log.topics[3]!).toString();\n break;\n }\n }\n }\n\n const details: Record<string, string | undefined> = {\n to: tx.to,\n from: account.address,\n block_number: receipt.blockNumber?.toString(),\n gas_limit: gasLimit.toString(),\n gas_used: receipt.gasUsed?.toString(),\n explorer_url: txUrl,\n mode: \"broadcast\",\n };\n if (mintedTokenId) {\n details.minted_token_id = mintedTokenId;\n process.stderr.write(` Minted NFT tokenId: ${mintedTokenId}\\n`);\n }\n\n return {\n tx_hash: txHash,\n status,\n gas_used: receipt.gasUsed ? Number(receipt.gasUsed) : undefined,\n description: tx.description,\n details,\n };\n }\n}\n\n/** Extract a human-readable revert reason from an RPC error message */\nfunction extractRevertReason(err: string): string {\n for (const marker of [\"execution reverted:\", \"revert:\", \"Error(\"]) {\n const pos = err.indexOf(marker);\n if (pos !== -1) return err.slice(pos);\n }\n return err.length > 200 ? err.slice(0, 200) + \"...\" : err;\n}\n","import { jsonStringify, jsonReplacerDecimal } from \"@hypurrquant/defi-core\";\nimport { renderTable } from \"./table.js\";\n\nexport interface OutputMode {\n json: boolean;\n ndjson: boolean;\n fields?: string[];\n}\n\nexport function parseOutputMode(opts: {\n json?: boolean;\n ndjson?: boolean;\n fields?: string;\n}): OutputMode {\n return {\n json: !!(opts.json || opts.ndjson),\n ndjson: !!opts.ndjson,\n fields: opts.fields\n ? opts.fields.split(\",\").map((f) => f.trim())\n : undefined,\n };\n}\n\nexport function formatOutput(value: unknown, mode: OutputMode): string {\n if (mode.ndjson) {\n return JSON.stringify(value, jsonReplacerDecimal);\n }\n\n if (mode.json) {\n let jsonVal = JSON.parse(jsonStringify(value));\n\n if (mode.fields && typeof jsonVal === \"object\" && jsonVal !== null && !Array.isArray(jsonVal)) {\n const filtered: Record<string, unknown> = {};\n for (const key of mode.fields) {\n if (key in jsonVal) filtered[key] = jsonVal[key];\n }\n jsonVal = filtered;\n }\n\n return JSON.stringify(jsonVal, null, 2);\n }\n\n // Human-readable: try table format, fallback to pretty JSON\n const jsonVal = JSON.parse(jsonStringify(value));\n const table = renderTable(jsonVal);\n if (table !== null) return table;\n return JSON.stringify(jsonVal, null, 2);\n}\n\nexport function printOutput(value: unknown, mode: OutputMode): void {\n console.log(formatOutput(value, mode));\n}\n","import pc from \"picocolors\";\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\n/** Try to render a JSON value as a human-readable table. Returns null if shape isn't recognized. */\nexport function renderTable(value: JsonValue): string | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return null;\n\n const v = value as Record<string, JsonValue>;\n\n if (\"alerts\" in v && \"scan_duration_ms\" in v) return renderScan(v);\n if (\"holders\" in v) return renderWhales(v);\n if (\"opportunities\" in v && \"total_opportunities\" in v) return renderCompare(v);\n if (\"arb_opportunities\" in v && \"rates\" in v) return renderYieldScan(v);\n if (\"rates\" in v && \"asset\" in v) return renderYield(v);\n if (\"chains\" in v && \"total_alerts\" in v) return renderScanAll(v);\n if (\"chains\" in v && \"chains_scanned\" in v) return renderPositions(v);\n if (\"bridge\" in v && \"amount_out\" in v) return renderBridge(v);\n if (\"aggregator\" in v && \"amount_out\" in v) return renderSwap(v);\n if (\"protocols\" in v && \"summary\" in v) return renderStatus(v);\n if (\"token_balances\" in v && \"lending_positions\" in v) return renderPortfolio(v);\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Simple table helpers (no external dep)\n// ---------------------------------------------------------------------------\n\nfunction makeTable(headers: string[], rows: string[][]): string {\n const colWidths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? \"\").replace(/\\x1b\\[[0-9;]*m/g, \"\").length))\n );\n\n const sep = \"┼\" + colWidths.map((w) => \"─\".repeat(w + 2)).join(\"┼\") + \"┼\";\n const topBorder = \"┌\" + colWidths.map((w) => \"─\".repeat(w + 2)).join(\"┬\") + \"┐\";\n const midBorder = \"├\" + colWidths.map((w) => \"─\".repeat(w + 2)).join(\"┼\") + \"┤\";\n const botBorder = \"└\" + colWidths.map((w) => \"─\".repeat(w + 2)).join(\"┴\") + \"┘\";\n\n function padCell(text: string, width: number): string {\n const visLen = text.replace(/\\x1b\\[[0-9;]*m/g, \"\").length;\n return text + \" \".repeat(Math.max(0, width - visLen));\n }\n\n const headerRow = \"│ \" + headers.map((h, i) => padCell(pc.bold(h), colWidths[i])).join(\" │ \") + \" │\";\n const dataRows = rows.map(\n (row) => \"│ \" + row.map((cell, i) => padCell(cell ?? \"\", colWidths[i])).join(\" │ \") + \" │\"\n );\n\n return [topBorder, headerRow, midBorder, ...dataRows, botBorder].join(\"\\n\");\n}\n\nfunction asStr(v: JsonValue | undefined): string {\n if (v === undefined || v === null) return \"?\";\n return String(v);\n}\n\nfunction asF64(v: JsonValue | undefined): number {\n if (typeof v === \"number\") return v;\n if (typeof v === \"string\") return parseFloat(v) || 0;\n return 0;\n}\n\nfunction asU64(v: JsonValue | undefined): number {\n if (typeof v === \"number\") return Math.floor(v);\n if (typeof v === \"string\") return parseInt(v, 10) || 0;\n return 0;\n}\n\nfunction asArr(v: JsonValue | undefined): JsonValue[] {\n if (Array.isArray(v)) return v;\n return [];\n}\n\nfunction asObj(v: JsonValue | undefined): Record<string, JsonValue> {\n if (v && typeof v === \"object\" && !Array.isArray(v)) return v as Record<string, JsonValue>;\n return {};\n}\n\nfunction formatPrice(v: JsonValue | undefined): string {\n const p = asF64(v);\n if (p === 0) return \"?\";\n return p > 1000 ? `$${p.toFixed(0)}` : `$${p.toFixed(4)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Renderers\n// ---------------------------------------------------------------------------\n\nfunction renderScan(v: Record<string, JsonValue>): string {\n const chain = asStr(v[\"chain\"]);\n const ms = asU64(v[\"scan_duration_ms\"]);\n const count = asU64(v[\"alert_count\"]);\n let out = ` Scan: ${chain} (${ms} ms)\\n`;\n\n if (count > 0) {\n const rows = asArr(v[\"alerts\"]).map((a) => {\n const ao = asObj(a as JsonValue);\n const sev = asStr(ao[\"severity\"]);\n const color = sev === \"critical\" ? pc.red : sev === \"high\" ? pc.yellow : pc.cyan;\n return [\n color(sev.toUpperCase()),\n asStr(ao[\"pattern\"]),\n asStr(ao[\"asset\"]),\n formatPrice(ao[\"oracle_price\"]),\n formatPrice(ao[\"dex_price\"]),\n `${asF64(ao[\"deviation_pct\"]).toFixed(1)}%`,\n ];\n });\n out += makeTable([\"Severity\", \"Pattern\", \"Asset\", \"Oracle\", \"DEX\", \"Gap\"], rows);\n } else {\n out += ` ${count} alerts\\n`;\n }\n\n const data = asObj(v[\"data\"]);\n const o = Object.keys(asObj(data[\"oracle_prices\"])).length;\n const d = Object.keys(asObj(data[\"dex_prices\"])).length;\n const s = Object.keys(asObj(data[\"stablecoin_pegs\"])).length;\n out += `\\n Data: ${o} oracle, ${d} dex, ${s} stablecoin prices`;\n return out;\n}\n\nfunction renderScanAll(v: Record<string, JsonValue>): string {\n const total = asU64(v[\"total_alerts\"]);\n const scanned = asU64(v[\"chains_scanned\"]);\n const ms = asU64(v[\"scan_duration_ms\"]);\n\n const rows = asArr(v[\"chains\"]).map((c) => {\n const co = asObj(c as JsonValue);\n const alerts = asU64(co[\"alert_count\"]);\n const cms = asU64(co[\"scan_duration_ms\"]);\n const details = asArr(co[\"alerts\"])\n .map((a) => asStr(asObj(a as JsonValue)[\"asset\"]))\n .join(\", \") || \"clean\";\n const alertStr = alerts > 0 ? pc.yellow(String(alerts)) : pc.green(String(alerts));\n return [asStr(co[\"chain\"]), alertStr, `${cms}ms`, details];\n });\n\n return ` All-chain scan: ${scanned} chains, ${total} alerts, ${ms}ms\\n\\n` +\n makeTable([\"Chain\", \"Alerts\", \"Time\", \"Details\"], rows);\n}\n\nfunction renderWhales(v: Record<string, JsonValue>): string {\n const chain = asStr(v[\"chain\"]);\n const token = asStr(v[\"token\"]);\n\n const rows = asArr(v[\"holders\"]).map((h) => {\n const ho = asObj(h as JsonValue);\n const addr = asStr(ho[\"address\"]);\n const short = addr.length > 18 ? `${addr.slice(0, 10)}...${addr.slice(-6)}` : addr;\n return [String(asU64(ho[\"rank\"])), short, asF64(ho[\"balance\"]).toFixed(2)];\n });\n\n return ` ${chain} ${token} Top Holders\\n\\n` + makeTable([\"#\", \"Address\", `${token} Balance`], rows);\n}\n\nfunction renderYield(v: Record<string, JsonValue>): string {\n const chain = asStr(v[\"chain\"]);\n const asset = asStr(v[\"asset\"]);\n\n const rows = asArr(v[\"rates\"]).map((r) => {\n const ro = asObj(r as JsonValue);\n const supply = asF64(ro[\"supply_apy\"]);\n const borrow = asF64(ro[\"borrow_variable_apy\"]);\n const color = supply > 3 ? pc.green : supply > 1 ? pc.cyan : (s: string) => s;\n return [asStr(ro[\"protocol\"]), color(`${supply.toFixed(2)}%`), `${borrow.toFixed(2)}%`];\n });\n\n const best = asStr(v[\"best_supply\"]);\n return ` ${chain} ${asset} Yield Comparison (best: ${best})\\n\\n` +\n makeTable([\"Protocol\", \"Supply APY\", \"Borrow APY\"], rows);\n}\n\nfunction renderPositions(v: Record<string, JsonValue>): string {\n const addr = asStr(v[\"address\"]);\n const summary = asObj(v[\"summary\"]);\n const total = asF64(v[\"total_value_usd\"] ?? summary[\"total_value_usd\"]);\n const ms = asU64(v[\"scan_duration_ms\"]);\n const scanned = asU64(v[\"chains_scanned\"]);\n\n let out = ` Positions for ${addr.slice(0, 8)}...${addr.slice(-4)} (${ms}ms, ${scanned} chains)\\n Total: $${total.toFixed(2)}\\n\\n`;\n\n for (const c of asArr(v[\"chains\"])) {\n const co = asObj(c as JsonValue);\n const chain = asStr(co[\"chain\"]);\n const ctotal = asF64(co[\"chain_total_usd\"]);\n out += ` ${chain} ($${ctotal.toFixed(2)})\\n`;\n\n const rows: string[][] = [];\n for (const b of asArr(co[\"token_balances\"])) {\n const bo = asObj(b as JsonValue);\n rows.push([\"wallet\", asStr(bo[\"symbol\"]), pc.green(`$${asF64(bo[\"value_usd\"]).toFixed(2)}`)]);\n }\n for (const l of asArr(co[\"lending_positions\"])) {\n const lo = asObj(l as JsonValue);\n const coll = asF64(lo[\"collateral_usd\"]);\n const debt = asF64(lo[\"debt_usd\"]);\n rows.push([\"lending\", asStr(lo[\"protocol\"]), pc.cyan(`coll $${coll.toFixed(0)} debt $${debt.toFixed(0)}`)]);\n }\n out += makeTable([\"Type\", \"Asset/Protocol\", \"Value\"], rows) + \"\\n\";\n }\n return out;\n}\n\nfunction renderSwap(v: Record<string, JsonValue>): string {\n const from = asStr(v[\"from\"]);\n const to = asStr(v[\"to\"]);\n const amtIn = asF64(v[\"amount_in\"]);\n const amtOut = asF64(v[\"amount_out\"]);\n const impact = typeof v[\"price_impact_pct\"] === \"number\"\n ? `${asF64(v[\"price_impact_pct\"]).toFixed(4)}%`\n : \"n/a\";\n const agg = asStr(v[\"aggregator\"]);\n const chain = asStr(v[\"chain\"]);\n return ` Swap on ${chain} via ${agg}\\n\\n ${amtIn} ${from} -> ${amtOut.toFixed(6)} ${to}\\n Price impact: ${impact}\\n`;\n}\n\nfunction renderBridge(v: Record<string, JsonValue>): string {\n const from = asStr(v[\"from_chain\"]);\n const to = asStr(v[\"to_chain\"]);\n const token = asStr(v[\"token\"]);\n const amtIn = asF64(v[\"amount_in\"]);\n const amtOut = asF64(v[\"amount_out\"]);\n const cost = asF64(v[\"total_cost_usd\"]);\n const time = asU64(v[\"estimated_time_sec\"]);\n const bridge = asStr(v[\"bridge\"]);\n return ` Bridge ${from} -> ${to} via ${bridge}\\n\\n ${amtIn} ${token} -> ${amtOut.toFixed(6)} ${token}\\n Cost: $${cost.toFixed(2)} | Time: ${time}s\\n`;\n}\n\nfunction renderStatus(v: Record<string, JsonValue>): string {\n const chain = asStr(v[\"chain\"]);\n const summary = asObj(v[\"summary\"]);\n const totalP = asU64(summary[\"total_protocols\"]);\n const totalT = asU64(summary[\"total_tokens\"]);\n\n const rows = asArr(v[\"protocols\"]).map((p) => {\n const po = asObj(p as JsonValue);\n return [asStr(po[\"name\"]), asStr(po[\"category\"]), asStr(po[\"interface\"])];\n });\n\n const tokens = asArr(v[\"tokens\"]).map((t) => String(t)).filter(Boolean);\n let out = ` ${chain} — ${totalP} protocols`;\n if (tokens.length > 0) {\n out += `, ${totalT} tokens\\n Tokens: ${tokens.join(\", \")}`;\n }\n return `${out}\\n\\n` + makeTable([\"Protocol\", \"Category\", \"Interface\"], rows);\n}\n\nfunction renderCompare(v: Record<string, JsonValue>): string {\n const asset = asStr(v[\"asset\"]);\n const ms = asU64(v[\"scan_duration_ms\"]);\n const total = asU64(v[\"total_opportunities\"]);\n\n const rows = asArr(v[\"opportunities\"]).map((opp) => {\n const oo = asObj(opp as JsonValue);\n const typ = asStr(oo[\"type\"]);\n const apy = asF64(oo[\"apy\"]);\n const detail = asStr(oo[\"detail\"]);\n const risk = asStr(oo[\"risk\"]);\n const oppAsset = asStr(oo[\"asset\"]);\n\n const typeLabel = typ === \"perp_funding\" ? \"Perp Arb\"\n : typ === \"perp_rate\" ? \"Perp Rate\"\n : typ === \"lending_supply\" ? \"Lending\"\n : typ;\n\n const apyColor = Math.abs(apy) > 20 ? pc.green : Math.abs(apy) > 5 ? pc.cyan : (s: string) => s;\n const riskColor = risk === \"high\" ? pc.red : risk === \"medium\" ? pc.yellow : pc.green;\n\n return [typeLabel, oppAsset, apyColor(`${apy.toFixed(1)}%`), detail, riskColor(risk)];\n });\n\n return ` Yield Compare: ${asset} (${total} opportunities, ${ms}ms)\\n\\n` +\n makeTable([\"Type\", \"Asset\", \"APY\", \"Where\", \"Risk\"], rows);\n}\n\nfunction renderYieldScan(v: Record<string, JsonValue>): string {\n const asset = asStr(v[\"asset\"]);\n const ms = asU64(v[\"scan_duration_ms\"]);\n const best = asStr(v[\"best_supply\"]);\n\n const rows = asArr(v[\"rates\"]).map((r) => {\n const ro = asObj(r as JsonValue);\n const supply = asF64(ro[\"supply_apy\"]);\n const borrow = asF64(ro[\"borrow_variable_apy\"]);\n const color = supply > 3 ? pc.green : supply > 1 ? pc.cyan : (s: string) => s;\n return [asStr(ro[\"chain\"]), asStr(ro[\"protocol\"]), color(`${supply.toFixed(2)}%`), `${borrow.toFixed(2)}%`];\n });\n\n let out = ` ${asset} Yield Scan (${ms}ms) — Best: ${best}\\n\\n` +\n makeTable([\"Chain\", \"Protocol\", \"Supply APY\", \"Borrow APY\"], rows);\n\n const arbs = asArr(v[\"arb_opportunities\"]);\n if (arbs.length > 0) {\n const arbRows = arbs.map((a) => {\n const ao = asObj(a as JsonValue);\n const spread = asF64(ao[\"spread_pct\"]);\n const color = spread > 1 ? pc.green : pc.cyan;\n return [\n color(`+${spread.toFixed(2)}%`),\n `${asStr(ao[\"supply_protocol\"])} (${asStr(ao[\"supply_chain\"])})`,\n `${asStr(ao[\"borrow_protocol\"])} (${asStr(ao[\"borrow_chain\"])})`,\n asStr(ao[\"strategy\"]),\n ];\n });\n out += \"\\n Arb Opportunities\\n\\n\" + makeTable([\"Spread\", \"Supply @\", \"Borrow @\", \"Type\"], arbRows);\n }\n\n return out;\n}\n\nfunction renderPortfolio(v: Record<string, JsonValue>): string {\n return renderPositions(v);\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\nimport { createPublicClient, http } from \"viem\";\n\ninterface ContractStatus {\n name: string;\n address: string;\n has_code?: boolean;\n status?: string;\n}\n\ninterface ProtocolStatus {\n slug: string;\n name: string;\n category: string;\n interface: string;\n contracts: ContractStatus[];\n}\n\ninterface StatusSummary {\n total_protocols: number;\n verified_contracts?: number;\n invalid_contracts?: number;\n placeholder_contracts?: number;\n}\n\ninterface StatusOutput {\n chain: string;\n chain_id: number;\n rpc_url: string;\n block_number?: number;\n protocols: ProtocolStatus[];\n summary: StatusSummary;\n}\n\nfunction isPlaceholder(addr: string): boolean {\n if (!addr.startsWith(\"0x\") || addr.length !== 42) return false;\n const hex = addr.slice(2).toLowerCase();\n return hex.slice(0, 36).split(\"\").every((c) => c === \"0\") && parseInt(hex.slice(36), 16) <= 0x10;\n}\n\nexport function registerStatus(\n parent: Command,\n getOpts: () => OutputMode,\n): void {\n parent\n .command(\"status\")\n .description(\"Show chain and protocol status\")\n .option(\"--verify\", \"Verify contract addresses on-chain\")\n .action(async (opts) => {\n const globalOpts = parent.opts<{ chain?: string }>();\n const registry = Registry.loadEmbedded();\n\n const chainKeys = globalOpts.chain\n ? [globalOpts.chain]\n : Array.from(registry.chains.keys());\n\n if (chainKeys.length > 1) {\n // Multi-chain summary\n const summary: unknown[] = [];\n for (const ck of chainKeys) {\n const cc = registry.getChain(ck);\n const protos = registry.getProtocolsForChain(ck);\n summary.push({\n chain: cc.name,\n chain_id: cc.chain_id,\n rpc_url: cc.effectiveRpcUrl(),\n protocols: protos.map(p => ({ slug: p.slug, name: p.name, category: p.category, interface: p.interface })),\n summary: { total_protocols: protos.length },\n });\n }\n printOutput(summary, getOpts());\n return;\n }\n\n const chainName = chainKeys[0]!;\n const chainConfig = registry.getChain(chainName);\n const chainProtocols = registry.getProtocolsForChain(chainName);\n\n let blockNumber: number | undefined;\n let codeMap: Map<string, boolean> | undefined;\n let placeholderCount = 0;\n\n // Count placeholders\n for (const p of chainProtocols) {\n for (const addr of Object.values(p.contracts ?? {}) as string[]) {\n if (isPlaceholder(addr)) placeholderCount++;\n }\n }\n\n if (opts.verify) {\n const rpcUrl = chainConfig.effectiveRpcUrl();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n try {\n const bn = await client.getBlockNumber();\n blockNumber = Number(bn);\n process.stderr.write(\n `Connected to ${rpcUrl} (block #${blockNumber}). Verifying contracts...\\n`,\n );\n } catch (e) {\n process.stderr.write(`Warning: could not get block number\\n`);\n }\n\n codeMap = new Map();\n const allAddrs: Array<{ key: string; addr: Address }> = [];\n\n for (const p of chainProtocols) {\n for (const [name, addr] of Object.entries(p.contracts ?? {}) as [string, string][]) {\n if (!isPlaceholder(addr)) {\n allAddrs.push({ key: `${p.name}:${name}`, addr: addr as Address });\n }\n }\n }\n\n // Batch verify in chunks of 20\n for (let i = 0; i < allAddrs.length; i += 20) {\n const chunk = allAddrs.slice(i, i + 20);\n const results = await Promise.all(\n chunk.map(async ({ key, addr }) => {\n try {\n const code = await client.getCode({ address: addr as `0x${string}` });\n return { key, hasCode: !!code && code !== \"0x\" };\n } catch {\n return { key, hasCode: false };\n }\n }),\n );\n for (const r of results) {\n codeMap.set(r.key, r.hasCode);\n }\n }\n }\n\n // Build output\n let verifiedCount = 0;\n let invalidCount = 0;\n\n const protocols: ProtocolStatus[] = chainProtocols.map((p) => {\n const contracts: ContractStatus[] = (Object.entries(p.contracts ?? {}) as [string, string][]).map(\n ([name, addr]) => {\n if (isPlaceholder(addr)) {\n return { name, address: addr, status: \"placeholder\" };\n }\n if (codeMap) {\n const hasCode = codeMap.get(`${p.name}:${name}`) ?? false;\n if (hasCode) verifiedCount++;\n else invalidCount++;\n return {\n name,\n address: addr,\n has_code: hasCode,\n status: hasCode ? \"verified\" : \"NO_CODE\",\n };\n }\n return { name, address: addr };\n },\n );\n\n return {\n slug: p.slug,\n name: p.name,\n category: p.category,\n interface: p.interface,\n contracts,\n };\n });\n\n const output: StatusOutput = {\n chain: chainConfig.name,\n chain_id: chainConfig.chain_id,\n rpc_url: chainConfig.effectiveRpcUrl(),\n ...(blockNumber !== undefined ? { block_number: blockNumber } : {}),\n protocols,\n summary: {\n total_protocols: protocols.length,\n ...(opts.verify\n ? {\n verified_contracts: verifiedCount,\n invalid_contracts: invalidCount,\n placeholder_contracts: placeholderCount,\n }\n : {}),\n },\n };\n\n printOutput(output, getOpts());\n });\n}\n","import * as readline from \"readline\";\nimport type { Executor } from \"./executor.js\";\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type { Registry } from \"@hypurrquant/defi-core\";\n\nexport interface AgentCommand {\n action: string;\n params: unknown;\n}\n\nexport interface AgentResponse {\n action: string;\n success: boolean;\n result?: unknown;\n error?: string;\n}\n\nexport async function runAgent(registry: Registry, executor: Executor): Promise<void> {\n const rl = readline.createInterface({ input: process.stdin, terminal: false });\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let cmd: AgentCommand;\n try {\n cmd = JSON.parse(trimmed) as AgentCommand;\n } catch (e: unknown) {\n const resp: AgentResponse = {\n action: \"unknown\",\n success: false,\n error: `Invalid JSON: ${e instanceof Error ? e.message : String(e)}`,\n };\n console.log(JSON.stringify(resp));\n continue;\n }\n\n const resp = await dispatchCommand(cmd, registry, executor);\n console.log(JSON.stringify(resp));\n }\n}\n\nasync function dispatchCommand(\n cmd: AgentCommand,\n registry: Registry,\n executor: Executor,\n): Promise<AgentResponse> {\n try {\n const result = await handleAction(cmd.action, cmd.params, registry, executor);\n return { action: cmd.action, success: true, result };\n } catch (e: unknown) {\n return {\n action: cmd.action,\n success: false,\n error: e instanceof Error ? e.message : String(e),\n };\n }\n}\n\nasync function handleAction(\n action: string,\n params: unknown,\n registry: Registry,\n executor: Executor,\n): Promise<unknown> {\n const p = (params ?? {}) as Record<string, unknown>;\n\n switch (action) {\n case \"status\":\n return handleStatus(registry);\n\n case \"list_protocols\":\n return handleListProtocols(registry, p);\n\n case \"schema\":\n return handleSchema(p);\n\n case \"yield\":\n case \"lending.rates\":\n case \"lending.position\":\n case \"lending.supply\":\n case \"lending.borrow\":\n case \"lending.repay\":\n case \"lending.withdraw\":\n case \"lp.discover\":\n case \"lp.add\":\n case \"lp.farm\":\n case \"lp.claim\":\n case \"lp.remove\":\n case \"swap\":\n case \"price\":\n case \"token.balance\":\n case \"token.approve\":\n case \"token.transfer\":\n case \"wallet.balance\":\n case \"portfolio.show\":\n case \"bridge\":\n throw DefiError.unsupported(`Agent action '${action}' — use CLI commands directly (e.g. defi --chain hyperevm lending rates --protocol hypurrfi --asset USDC)`);\n\n default:\n throw DefiError.unsupported(`Unknown action: ${action}`);\n }\n}\n\nfunction handleStatus(registry: Registry): unknown {\n const chain = registry.getChain(\"hyperevm\");\n const protocols = registry.protocols.map((p) => ({\n name: p.name,\n slug: p.slug,\n category: p.category,\n interface: p.interface,\n native: p.native,\n }));\n\n return {\n chain: chain.name,\n chain_id: chain.chain_id,\n protocol_count: protocols.length,\n protocols,\n };\n}\n\nfunction handleListProtocols(registry: Registry, params: Record<string, unknown>): unknown {\n const categoryFilter = typeof params[\"category\"] === \"string\" ? params[\"category\"] : undefined;\n\n const protocols = registry.protocols\n .filter((p) => !categoryFilter || p.category.toLowerCase() === categoryFilter.toLowerCase())\n .map((p) => ({\n name: p.name,\n slug: p.slug,\n category: p.category,\n interface: p.interface,\n }));\n\n return { protocols };\n}\n\nexport function handleSchema(params: Record<string, unknown>): unknown {\n const action = typeof params[\"action\"] === \"string\" ? params[\"action\"] : \"all\";\n\n switch (action) {\n case \"status\":\n return { action: \"status\", params: {}, cli: \"defi status\" };\n\n case \"list_protocols\":\n return {\n action: \"list_protocols\",\n params: {\n category: { type: \"string\", required: false, description: \"Filter by category (e.g. dex, lending)\" },\n },\n cli: \"defi status\",\n };\n\n case \"yield\":\n return {\n action: \"yield\",\n params: {\n chain: { type: \"string\", required: false, description: \"Target chain (omit for all chains)\" },\n asset: { type: \"string\", required: false, default: \"USDC\", description: \"Token symbol\" },\n },\n cli: \"defi yield --asset USDC\",\n };\n\n case \"lending.rates\":\n return {\n action: \"lending.rates\",\n params: {\n chain: { type: \"string\", required: true, description: \"Target chain\" },\n protocol: { type: \"string\", required: true, description: \"Protocol slug\" },\n asset: { type: \"string\", required: true, description: \"Token symbol or address\" },\n },\n cli: \"defi --chain hyperevm lending rates --protocol hypurrfi --asset USDC\",\n };\n\n case \"lending.supply\":\n case \"lending.borrow\":\n case \"lending.repay\":\n case \"lending.withdraw\":\n return {\n action,\n params: {\n chain: { type: \"string\", required: true, description: \"Target chain\" },\n protocol: { type: \"string\", required: true, description: \"Protocol slug\" },\n asset: { type: \"string\", required: true, description: \"Token symbol or address\" },\n amount: { type: \"string\", required: true, description: \"Amount in wei\" },\n },\n cli: `defi --chain hyperevm lending ${action.split(\".\")[1]} --protocol hypurrfi --asset USDC --amount 1000000`,\n };\n\n case \"lp.discover\":\n return {\n action: \"lp.discover\",\n params: {\n chain: { type: \"string\", required: true, description: \"Target chain\" },\n protocol: { type: \"string\", required: false, description: \"Filter by protocol slug\" },\n },\n cli: \"defi --chain hyperevm lp discover\",\n };\n\n case \"swap\":\n return {\n action: \"swap\",\n params: {\n chain: { type: \"string\", required: true, description: \"Target chain\" },\n from: { type: \"string\", required: true, description: \"Input token symbol or address\" },\n to: { type: \"string\", required: true, description: \"Output token symbol or address\" },\n amount: { type: \"string\", required: true, description: \"Amount in wei\" },\n provider: { type: \"string\", required: false, default: \"kyber\", description: \"Aggregator: kyber, openocean, liquid\" },\n slippage: { type: \"string\", required: false, default: \"50\", description: \"Slippage in bps\" },\n },\n cli: \"defi --chain hyperevm swap --from USDC --to WHYPE --amount 1000000\",\n };\n\n case \"price\":\n return {\n action: \"price\",\n params: {\n chain: { type: \"string\", required: true, description: \"Target chain\" },\n asset: { type: \"string\", required: true, description: \"Token symbol or address\" },\n },\n cli: \"defi --chain hyperevm price --asset WHYPE\",\n };\n\n case \"bridge\":\n return {\n action: \"bridge\",\n params: {\n chain: { type: \"string\", required: true, description: \"Source chain\" },\n token: { type: \"string\", required: true, description: \"Token symbol or address\" },\n amount: { type: \"string\", required: true, description: \"Amount in wei\" },\n to_chain: { type: \"string\", required: true, description: \"Destination chain\" },\n },\n cli: \"defi --chain hyperevm bridge --token USDC --amount 1000000 --to-chain mantle\",\n };\n\n default:\n return {\n actions: [\n \"status\", \"list_protocols\", \"schema\",\n \"yield\",\n \"lending.rates\", \"lending.supply\", \"lending.borrow\", \"lending.repay\", \"lending.withdraw\",\n \"lp.discover\", \"lp.add\", \"lp.farm\", \"lp.claim\", \"lp.remove\",\n \"swap\", \"price\",\n \"token.balance\", \"token.approve\", \"token.transfer\",\n \"wallet.balance\",\n \"portfolio.show\",\n \"bridge\",\n ],\n };\n }\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { handleSchema } from \"../agent.js\";\n\nexport function registerSchema(parent: Command, getOpts: () => OutputMode): void {\n parent\n .command(\"schema [command]\")\n .description(\"Output JSON schema for a command (agent-friendly)\")\n .option(\"--all\", \"Show all schemas\")\n .action(async (command: string | undefined, opts: { all?: boolean }) => {\n const mode = getOpts();\n const action = opts.all ? \"all\" : (command ?? \"all\");\n const params: Record<string, unknown> = { action };\n const schema = handleSchema(params);\n printOutput(schema, mode);\n });\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport type { Executor } from \"../executor.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry, ProtocolCategory } from \"@hypurrquant/defi-core\";\nimport type { Address, Hex } from \"viem\";\nimport { parseAbi, encodeFunctionData, decodeFunctionResult, createPublicClient, http, zeroAddress } from \"viem\";\nimport { multicallRead, decodeU256 } from \"@hypurrquant/defi-core\";\nimport {\n createDex,\n createGauge,\n createKittenSwapFarming,\n createMerchantMoeLB,\n createLending,\n createNestOffChain,\n} from \"@hypurrquant/defi-protocols\";\nimport { loadWhitelist } from \"../whitelist.js\";\nimport type { WhitelistEntry } from \"../whitelist.js\";\nimport { resolveWalletWithSigner } from \"../signer/resolve.js\";\n\n/** Resolve the wallet owner address from options or env vars (including OWS wallets) */\nfunction resolveAccount(optOwner?: string, optWallet?: string): Address {\n if (optOwner) return optOwner as Address;\n const { address } = resolveWalletWithSigner(optWallet ? { wallet: optWallet } : undefined);\n return address;\n}\n\ninterface PipelineStep {\n step: \"mint\" | \"stake\" | \"claim\" | \"collect\";\n function: string;\n optional?: boolean;\n note?: string;\n cli_command?: string;\n}\n\ninterface PipelineInput {\n chain?: string;\n pool?: string;\n tokenA?: string;\n tokenB?: string;\n amountA?: string;\n amountB?: string;\n tickLower?: string;\n tickUpper?: string;\n range?: string;\n tokenId?: string;\n gauge?: string;\n}\n\n/** Build a CLI command string with provided args inlined and `<placeholder>` for unknowns */\nfunction buildCmd(parts: Array<[string, string | undefined, string]>): string {\n // parts: [flag, value, placeholder]\n const segs: string[] = [];\n for (const [flag, value, placeholder] of parts) {\n segs.push(`${flag} ${value ?? `<${placeholder}>`}`);\n }\n return segs.join(\" \");\n}\n\n/**\n * Translate a protocol's reward_strategy into the on-chain function sequence\n * a caller must execute. cli_command fields are filled with provided args\n * (or `<placeholder>` for unknown values).\n */\nfunction buildPipelineSteps(\n p: { slug: string; reward_strategy?: string },\n input: PipelineInput = {},\n): PipelineStep[] {\n const slug = p.slug;\n const chainFlag = input.chain ? `--chain ${input.chain} ` : \"\";\n const baseAdd = `defi ${chainFlag}lp add ` + buildCmd([\n [\"--protocol\", slug, \"slug\"],\n [\"--token-a\", input.tokenA, \"token-a\"],\n [\"--token-b\", input.tokenB, \"token-b\"],\n [\"--amount-a\", input.amountA, \"amount-a\"],\n [\"--amount-b\", input.amountB, \"amount-b\"],\n ...(input.pool ? [[\"--pool\", input.pool, \"pool\"] as [string, string, string]] : []),\n ...(input.tickLower ? [[\"--tick-lower\", input.tickLower, \"tick-lower\"] as [string, string, string]] : []),\n ...(input.tickUpper ? [[\"--tick-upper\", input.tickUpper, \"tick-upper\"] as [string, string, string]] : []),\n ...(input.range ? [[\"--range\", input.range, \"range\"] as [string, string, string]] : []),\n ]);\n const baseFarm = `defi ${chainFlag}lp farm ` + buildCmd([\n [\"--protocol\", slug, \"slug\"],\n [\"--token-a\", input.tokenA, \"token-a\"],\n [\"--token-b\", input.tokenB, \"token-b\"],\n [\"--amount-a\", input.amountA, \"amount-a\"],\n [\"--amount-b\", input.amountB, \"amount-b\"],\n ...(input.pool ? [[\"--pool\", input.pool, \"pool\"] as [string, string, string]] : []),\n ]);\n const claimWithTokenId = (extra = \"\") => `defi ${chainFlag}lp claim ` + buildCmd([\n [\"--protocol\", slug, \"slug\"],\n [\"--token-id\", input.tokenId, \"token-id-from-mint-result\"],\n ...(input.pool ? [[\"--pool\", input.pool, \"pool\"] as [string, string, string]] : []),\n ...(input.gauge ? [[\"--gauge\", input.gauge, \"gauge\"] as [string, string, string]] : []),\n ]) + extra;\n const claimWithGauge = () => `defi ${chainFlag}lp claim ` + buildCmd([\n [\"--protocol\", slug, \"slug\"],\n [\"--gauge\", input.gauge, \"gauge-from-voter.gaugeForPool\"],\n ]);\n\n switch (p.reward_strategy) {\n case \"lp_fee_only\":\n return [\n { step: \"mint\", function: \"NPM.mint(MintParams)\", cli_command: baseAdd },\n { step: \"collect\", function: \"NPM.collect(tokenId, recipient)\", note: \"No emissions; collects accrued LP trading fees only\", cli_command: claimWithTokenId() },\n ];\n case \"on_chain_farming_center\":\n return [\n { step: \"mint\", function: \"NPM.mint(MintParams)\", cli_command: baseAdd },\n { step: \"stake\", function: \"farmingCenter.enterFarming(incentiveKey, tokenId)\", cli_command: baseFarm, note: \"lp farm chains mint+stake into one tx sequence\" },\n { step: \"claim\", function: \"farmingCenter.collectRewards(incentiveKey, tokenId)\", cli_command: claimWithTokenId() },\n ];\n case \"on_chain_gauge_tokenid\":\n return [\n { step: \"mint\", function: \"NPM.mint(MintParams)\", cli_command: baseAdd },\n { step: \"stake\", function: \"gauge.deposit(tokenId)\", cli_command: baseFarm, note: \"lp farm chains mint+stake into one tx sequence\" },\n { step: \"claim\", function: \"gauge.earned(tokenId) → gauge.getReward(tokenId)\", cli_command: claimWithTokenId() },\n ];\n case \"on_chain_gauge\":\n return [\n { step: \"mint\", function: \"Router.addLiquidity / NPM.mint\", cli_command: baseAdd },\n { step: \"stake\", function: \"gauge.deposit(amount)\", cli_command: baseFarm },\n { step: \"claim\", function: \"gauge.earned(token, account) → gauge.getReward(account, tokens[])\", cli_command: claimWithGauge() },\n ];\n case \"auto_stake\":\n return [\n { step: \"mint\", function: \"Router.addLiquidity / NPM.mint\", note: \"LP automatically receives x(3,3) emissions — no separate stake step\", cli_command: baseAdd },\n { step: \"claim\", function: \"gauge.getReward(account, tokens[])\", note: \"Multi-token reward (xRAM + WHYPE on Ramses HL)\", cli_command: claimWithGauge() },\n ];\n case \"on_chain_masterchef\":\n return [\n { step: \"mint\", function: \"NPM.mint or pool.mint\", cli_command: baseAdd },\n { step: \"stake\", function: \"MasterChef.deposit(pid, amount)\", cli_command: baseFarm },\n { step: \"claim\", function: \"MasterChef.harvest(pid) or pendingCake(pid, user)\", cli_command: claimWithTokenId() },\n ];\n case \"off_chain_api\":\n return [\n { step: \"mint\", function: \"NPM.mint(MintParams)\", cli_command: baseAdd },\n { step: \"claim\", function: \"GET claim-data → voter.aggregateClaim(...)\", note: \"Read-only: backend-signed ticket only; broadcast ABI unresolved (selector 0xd6d7a454, 11 args, public registries miss). Use the printed `ticket` payload to submit through the Nest UI.\", cli_command: `defi ${chainFlag}lp claim --protocol ${slug} --address <wallet>` },\n ];\n case \"none\":\n return [{ step: \"mint\", function: \"Router/NPM mint\", note: \"No reward path declared\", cli_command: baseAdd }];\n default:\n return [{ step: \"mint\", function: \"Router/NPM mint\", note: \"reward_strategy unset — pipeline cannot be inferred\", cli_command: baseAdd }];\n }\n}\n\n/** Resolve a pool: \"TOKEN_A/TOKEN_B\" name → address from registry, or raw 0x address */\nfunction resolvePoolAddress(registry: ReturnType<typeof Registry.loadEmbedded>, protocolSlug: string, pool: string): Address {\n if (pool.startsWith(\"0x\")) return pool as Address;\n return registry.resolvePool(protocolSlug, pool).address;\n}\n\n// ── Gauge APR enrichment ──\n\ntype V3PositionInfo = {\n token0: Address;\n token1: Address;\n tickLower: number;\n tickUpper: number;\n liquidity: bigint;\n};\n\n/**\n * Probe a V3-style NPM.positions(tokenId) and return normalized position info.\n * Tries the Ramses-CL non-standard layout (no nonce/operator) first, then the\n * standard Uniswap-V3 layout. Returns null if both decode attempts fail.\n */\nasync function detectV3Liquidity(\n client: ReturnType<typeof createPublicClient>,\n npm: Address,\n tokenId: bigint,\n): Promise<V3PositionInfo | null> {\n const ramsesAbi = parseAbi([\n \"function positions(uint256) view returns (address t0, address t1, int24 ts, int24 tl, int24 tu, uint128 liq, uint256 a, uint256 b, uint128 o0, uint128 o1)\",\n ]);\n const standardAbi = parseAbi([\n \"function positions(uint256) view returns (uint96 nonce, address op, address t0, address t1, uint24 fee, int24 tl, int24 tu, uint128 liq, uint256 a, uint256 b, uint128 o0, uint128 o1)\",\n ]);\n try {\n const r = await client.readContract({ address: npm, abi: ramsesAbi, functionName: \"positions\", args: [tokenId] }) as readonly [Address, Address, number, number, number, bigint, bigint, bigint, bigint, bigint];\n if (r[5] !== undefined) {\n return { token0: r[0], token1: r[1], tickLower: r[3], tickUpper: r[4], liquidity: r[5] };\n }\n } catch { /* try standard */ }\n try {\n const r = await client.readContract({ address: npm, abi: standardAbi, functionName: \"positions\", args: [tokenId] }) as readonly [bigint, Address, Address, Address, number, number, number, bigint, bigint, bigint, bigint, bigint];\n return { token0: r[2], token1: r[3], tickLower: r[5], tickUpper: r[6], liquidity: r[7] };\n } catch {\n return null;\n }\n}\n\nconst V2_PAIR_ABI = parseAbi([\n \"function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast)\",\n \"function totalSupply() external view returns (uint256)\",\n]);\nconst ERC20_DECIMALS_ABI = parseAbi([\"function decimals() external view returns (uint8)\"]);\n\ninterface DiscoveredPool {\n protocol: string;\n pool: string;\n pair?: string;\n type: \"FEE\" | \"EMISSION\";\n source: \"gauge\" | \"farming\" | \"lb_hooks\" | \"fee\" | \"masterchef\" | \"curve_factory\";\n apr?: string;\n total_reward?: string;\n bonus_reward?: string;\n active?: boolean;\n stopped?: boolean;\n moePerDay?: number;\n aprPercent?: number;\n rangeTvlUsd?: number;\n poolTvlUsd?: number;\n isTopPool?: boolean;\n rewardedBins?: number;\n minBinId?: number;\n maxBinId?: number;\n totalMoePerDay?: number;\n moePriceUsd?: number;\n rewardRate?: string;\n totalStaked?: string;\n rewardToken?: string;\n rewardPerDay?: number;\n rewardTokenSymbol?: string;\n}\n\n/**\n * Enrich gauge pools with APR by querying on-chain prices.\n * Only processes pools with rewardRate > 0.\n */\nasync function _enrichGaugeAprs(\n pools: DiscoveredPool[],\n rpcUrl: string,\n registry: ReturnType<typeof Registry.loadEmbedded>,\n chainName: string,\n): Promise<void> {\n const active = pools.filter(p => p.source === \"gauge\" && p.rewardRate && BigInt(p.rewardRate) > 0n);\n if (active.length === 0) return;\n\n // Use chain's wrapped native token instead of hardcoded WHYPE\n const chain = registry.getChain(chainName);\n const WRAPPED_NATIVE = (chain.wrapped_native ?? \"0x0000000000000000000000000000000000000000\") as Address;\n\n try {\n // Step 1: Get wrapped native token price via lending oracle\n let nativePriceUsd = 0;\n try {\n const protos = registry.getProtocolsForChain(chainName).filter(p => p.category === ProtocolCategory.Lending && p.interface === \"aave_v3\");\n if (protos.length > 0) {\n const { createOracleFromLending } = await import(\"@hypurrquant/defi-protocols\");\n const oracle = createOracleFromLending(protos[0]!, chain.effectiveRpcUrl());\n const price = await oracle.getPrice(WRAPPED_NATIVE);\n nativePriceUsd = price.price_f64;\n }\n } catch { /* skip */ }\n\n // Fallback: try stablecoin price (USDC = $1) if no Aave oracle\n if (nativePriceUsd === 0) {\n const tokens = registry.tokens.get(chainName);\n const stablecoin = tokens?.find(t => t.tags?.includes(\"stablecoin\") && (t.symbol === \"USDC\" || t.symbol === \"USDT\"));\n if (stablecoin) {\n // Try to get native price from a native/stablecoin pool in the discovered set\n const nativeStablePool = pools.find(p => {\n const pair = p.pair?.toUpperCase() ?? \"\";\n const nativeSym = chain.native_token?.toUpperCase() ?? \"\";\n const wrappedSym = \"W\" + nativeSym;\n return (pair.includes(nativeSym) || pair.includes(wrappedSym)) && (pair.includes(\"USDC\") || pair.includes(\"USDT\"));\n });\n if (nativeStablePool?.pool) {\n try {\n const [resRaw] = await multicallRead(rpcUrl, [\n [nativeStablePool.pool as Address, encodeFunctionData({ abi: V2_PAIR_ABI, functionName: \"getReserves\" })],\n ]);\n if (resRaw) {\n const _resAbi = parseAbi([\"function f() view returns (uint112, uint112, uint32)\"]);\n const [r0, r1] = decodeFunctionResult({ abi: _resAbi, functionName: \"f\", data: resRaw }) as unknown as [bigint, bigint, bigint];\n const stableDecimals = stablecoin.decimals ?? 6;\n const nativeIsToken0 = WRAPPED_NATIVE.toLowerCase() < stablecoin.address.toLowerCase();\n const reserveNative = Number(nativeIsToken0 ? r0 : r1) / 1e18;\n const reserveStable = Number(nativeIsToken0 ? r1 : r0) / (10 ** stableDecimals);\n if (reserveNative > 0) nativePriceUsd = reserveStable / reserveNative;\n }\n } catch { /* skip */ }\n }\n }\n }\n\n if (nativePriceUsd === 0) return;\n\n // Step 2: For each active gauge pool, compute APR\n for (const p of active) {\n const rewardRate = BigInt(p.rewardRate!);\n const totalStaked = BigInt(p.totalStaked || \"0\");\n const rewardPerDay = Number(rewardRate * 86400n) / 1e18;\n p.rewardPerDay = rewardPerDay;\n\n if (totalStaked === 0n || rewardPerDay === 0) continue;\n\n // Get reward token price\n // For now: assume reward tokens trade against WHYPE\n // NEST, HYBR, xRAM all have WHYPE pairs\n let rewardTokenPriceUsd = 0;\n const rewardToken = p.rewardToken as Address | undefined;\n\n if (rewardToken) {\n if (rewardToken.toLowerCase() === WRAPPED_NATIVE.toLowerCase()) {\n rewardTokenPriceUsd = nativePriceUsd;\n } else {\n // Find the reward token's pool paired with WHYPE\n // Use the pool from this gauge itself if it contains the reward token + WHYPE\n // Otherwise search all discovered pools\n const pair = p.pair ?? \"\";\n const nativeSym = chain.native_token ?? \"ETH\";\n const isRewardWhypePair = pair.toUpperCase().includes(\"W\" + nativeSym.toUpperCase()) || pair.toUpperCase().includes(nativeSym.toUpperCase());\n const tokenPoolAddr = isRewardWhypePair ? p.pool : pools.find(q =>\n q.source === \"gauge\" && q.pool.startsWith(\"0x\") && q.pair &&\n (q.pair.toUpperCase().includes(\"W\" + nativeSym.toUpperCase()) || q.pair.toUpperCase().includes(nativeSym.toUpperCase())) && q.rewardToken?.toLowerCase() === rewardToken.toLowerCase()\n )?.pool;\n\n if (tokenPoolAddr) {\n try {\n const [resRaw] = await multicallRead(rpcUrl, [\n [tokenPoolAddr as Address, encodeFunctionData({ abi: V2_PAIR_ABI, functionName: \"getReserves\" })],\n ]);\n if (resRaw) {\n const _resAbi = parseAbi([\"function f() view returns (uint112, uint112, uint32)\"]);\n const [r0, r1] = decodeFunctionResult({ abi: _resAbi, functionName: \"f\", data: resRaw }) as unknown as [bigint, bigint, bigint];\n const rewardIsToken0 = rewardToken.toLowerCase() < WRAPPED_NATIVE.toLowerCase();\n const reserveReward = Number(rewardIsToken0 ? r0 : r1) / 1e18;\n const reserveWhype = Number(rewardIsToken0 ? r1 : r0) / 1e18;\n if (reserveReward > 0) {\n rewardTokenPriceUsd = (reserveWhype / reserveReward) * nativePriceUsd;\n }\n }\n } catch { /* skip - might be CL pool */ }\n }\n\n // Fallback: try oracle for reward token price\n if (rewardTokenPriceUsd === 0) {\n try {\n const protos = registry.getProtocolsForChain(chainName).filter(pr => pr.category === ProtocolCategory.Lending);\n if (protos.length > 0) {\n const { createOracleFromLending } = await import(\"@hypurrquant/defi-protocols\");\n const chain = registry.getChain(chainName);\n const oracle = createOracleFromLending(protos[0]!, chain.effectiveRpcUrl());\n const price = await oracle.getPrice(rewardToken);\n rewardTokenPriceUsd = price.price_f64;\n }\n } catch { /* no oracle price */ }\n }\n }\n\n // Find symbol for reward token\n const tokens = registry.tokens.get(chainName);\n const tokenInfo = tokens?.find(t => t.address.toLowerCase() === rewardToken.toLowerCase());\n if (tokenInfo) p.rewardTokenSymbol = tokenInfo.symbol;\n }\n\n if (rewardTokenPriceUsd === 0) continue;\n\n // Get LP token value: query pool reserves + totalSupply\n try {\n const [resRaw, tsRaw] = await multicallRead(rpcUrl, [\n [p.pool as Address, encodeFunctionData({ abi: V2_PAIR_ABI, functionName: \"getReserves\" })],\n [p.pool as Address, encodeFunctionData({ abi: V2_PAIR_ABI, functionName: \"totalSupply\" })],\n ]);\n\n if (resRaw && tsRaw) {\n const _resAbi = parseAbi([\"function f() view returns (uint112, uint112, uint32)\"]);\n const [r0, r1] = decodeFunctionResult({ abi: _resAbi, functionName: \"f\", data: resRaw }) as unknown as [bigint, bigint, bigint];\n const totalSupply = decodeU256(tsRaw);\n\n // Simplified: assume both tokens are 18 decimals for V2 pairs\n // TVL = 2 × reserve_whype_side × whype_price (since V2 pools are 50/50)\n const pair = p.pair ?? \"\";\n const tokens = pair.split(\"/\");\n\n // Figure out which side is WHYPE (or valued token)\n let poolTvlUsd = 0;\n const r0F = Number(r0) / 1e18;\n const r1F = Number(r1) / 1e18;\n\n // If one side is WHYPE, double it for total TVL\n if (tokens[0] === \"WHYPE\" || tokens[0] === \"HYPE\") {\n poolTvlUsd = r0F * nativePriceUsd * 2;\n } else if (tokens[1] === \"WHYPE\" || tokens[1] === \"HYPE\") {\n poolTvlUsd = r1F * nativePriceUsd * 2;\n } else {\n // Try both reserves with known prices\n poolTvlUsd = r0F * rewardTokenPriceUsd + r1F * nativePriceUsd;\n }\n\n p.poolTvlUsd = poolTvlUsd;\n\n // Staked ratio\n const stakedRatio = totalSupply > 0n ? Number(totalStaked) / Number(totalSupply) : 0;\n const stakedTvlUsd = poolTvlUsd * stakedRatio;\n\n // APR = (rewardPerDay × rewardPrice × 365) / stakedTvlUsd × 100\n if (stakedTvlUsd > 10) { // minimum $10 staked to avoid division-by-dust\n p.aprPercent = (rewardPerDay * rewardTokenPriceUsd * 365 / stakedTvlUsd) * 100;\n }\n }\n } catch { /* skip pool with no V2 reserves (CL pool) */ }\n }\n } catch { /* APR enrichment failed, pools still have basic data */ }\n}\n\nexport function registerLP(parent: Command, getOpts: () => OutputMode, makeExecutor: () => Executor): void {\n const lp = parent\n .command(\"lp\")\n .description(\"Unified LP operations: discover, add, farm, claim, remove, positions\")\n .option(\"--wallet <name>\", \"OWS wallet name (alternative to DEFI_WALLET_ADDRESS)\");\n\n // ─────────────────────────────────────────\n // lp discover\n // ─────────────────────────────────────────\n lp.command(\"discover\")\n .description(\"Scan all protocols for fee + emission pools (gauges, farming, LB rewards)\")\n .option(\"--protocol <protocol>\", \"Filter to a single protocol slug\")\n .option(\"--emission-only\", \"Only show emission (gauge/farming) pools, skip fee-only\")\n .action(async (opts) => {\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const rpcUrl = chain.effectiveRpcUrl();\n\n // Determine which protocols to scan\n const allProtocols = registry.getProtocolsForChain(chainName);\n const protocols = opts.protocol\n ? [registry.getProtocol(opts.protocol)]\n : allProtocols;\n\n const results: DiscoveredPool[] = [];\n\n await Promise.allSettled(\n protocols.map(async (protocol) => {\n try {\n // Gauge-based protocols (solidly_v2, solidly_cl, algebra_v3, hybra, uniswap_v3 with voter)\n const isGaugeProtocol = [\"solidly_v2\", \"solidly_cl\", \"algebra_v3\", \"hybra\"].includes(protocol.interface) ||\n (protocol.interface === \"uniswap_v3\" && protocol.contracts?.[\"voter\"]);\n if (isGaugeProtocol) {\n const chainTokens = registry.tokens.get(chainName)?.map(t => t.address);\n const adapter = createGauge(protocol, rpcUrl, chainTokens);\n if (adapter.discoverGaugedPools) {\n const pools = await adapter.discoverGaugedPools();\n for (const p of pools) {\n results.push({\n protocol: protocol.slug,\n pool: p.pool,\n pair: `${p.token0}/${p.token1}`,\n type: \"EMISSION\",\n source: \"gauge\",\n rewardRate: p.rewardRate ? p.rewardRate.toString() : undefined,\n totalStaked: p.totalStaked ? p.totalStaked.toString() : undefined,\n rewardToken: p.rewardToken,\n });\n }\n }\n }\n\n // KittenSwap Algebra eternal farming\n if (protocol.interface === \"algebra_v3\" && protocol.contracts?.[\"farming_center\"]) {\n const adapter = createKittenSwapFarming(protocol, rpcUrl);\n const pools = await adapter.discoverFarmingPools();\n for (const p of pools) {\n results.push({\n protocol: protocol.slug,\n pool: p.pool,\n type: \"EMISSION\",\n source: \"farming\",\n total_reward: p.totalReward.toString(),\n bonus_reward: p.bonusReward.toString(),\n active: p.active,\n });\n }\n }\n\n // Merchant Moe LB hooks\n if (protocol.interface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n const adapter = createMerchantMoeLB(protocol, rpcUrl);\n const pools = await adapter.discoverRewardedPools();\n for (const p of pools) {\n if (!opts.emissionOnly || !p.stopped) {\n results.push({\n protocol: protocol.slug,\n pool: p.pool,\n pair: `${p.symbolX}/${p.symbolY}`,\n type: \"EMISSION\",\n source: \"lb_hooks\",\n stopped: p.stopped,\n moePerDay: p.moePerDay,\n aprPercent: p.aprPercent,\n rangeTvlUsd: p.rangeTvlUsd,\n poolTvlUsd: p.poolTvlUsd,\n isTopPool: p.isTopPool,\n rewardedBins: p.rewardedBins,\n minBinId: p.minBinId,\n maxBinId: p.maxBinId,\n totalMoePerDay: p.totalMoePerDay,\n moePriceUsd: p.moePriceUsd,\n });\n }\n }\n }\n // PancakeSwap V3 MasterChef emissions\n if (protocol.interface === \"uniswap_v3\" && protocol.contracts?.[\"masterchef\"]) {\n const mcAddr = protocol.contracts[\"masterchef\"] as Address;\n const mcAbi = parseAbi([\n \"function poolLength() view returns (uint256)\",\n \"function poolInfo(uint256) view returns (uint256 allocPoint, address v3Pool, address token0, address token1, uint24 fee, uint256 totalLiquidity, uint256 totalBoostLiquidity)\",\n \"function totalAllocPoint() view returns (uint256)\",\n \"function latestPeriodCakePerSecond() view returns (uint256)\",\n \"function CAKE() view returns (address)\",\n ]);\n const mcClient = createPublicClient({ transport: http(rpcUrl) });\n try {\n const [poolLen, totalAlloc, cakePerSec, cakeAddr] = await Promise.all([\n mcClient.readContract({ address: mcAddr, abi: mcAbi, functionName: \"poolLength\" }) as Promise<bigint>,\n mcClient.readContract({ address: mcAddr, abi: mcAbi, functionName: \"totalAllocPoint\" }) as Promise<bigint>,\n mcClient.readContract({ address: mcAddr, abi: mcAbi, functionName: \"latestPeriodCakePerSecond\" }) as Promise<bigint>,\n mcClient.readContract({ address: mcAddr, abi: mcAbi, functionName: \"CAKE\" }) as Promise<Address>,\n ]);\n // Scan top pools (limit to 100 with highest allocPoint)\n const MAX_MC_SCAN = Math.min(Number(poolLen), 100);\n const poolInfoCalls: Array<[Address, Hex]> = [];\n for (let i = 0; i < MAX_MC_SCAN; i++) {\n poolInfoCalls.push([mcAddr, encodeFunctionData({ abi: mcAbi, functionName: \"poolInfo\", args: [BigInt(i)] })]);\n }\n const poolInfoResults = await multicallRead(rpcUrl, poolInfoCalls);\n // Get CAKE price via oracle\n let cakePriceUsd = 0;\n try {\n const lendingProtos = registry.getProtocolsForChain(chainName).filter(lp => lp.category === ProtocolCategory.Lending && lp.interface === \"aave_v3\");\n if (lendingProtos.length > 0) {\n const { createOracleFromLending } = await import(\"@hypurrquant/defi-protocols\");\n const oracleInst = createOracleFromLending(lendingProtos[0]!, rpcUrl);\n const price = await oracleInst.getPrice(cakeAddr);\n cakePriceUsd = price.price_f64;\n }\n } catch { /* skip */ }\n\n for (let i = 0; i < poolInfoResults.length; i++) {\n const raw = poolInfoResults[i];\n if (!raw || raw.length < 66) continue;\n try {\n const decoded = decodeFunctionResult({ abi: mcAbi, functionName: \"poolInfo\", data: raw }) as unknown as [bigint, Address, Address, Address, number, bigint, bigint];\n const [allocPoint, v3Pool, t0, t1, , totalLiq] = decoded;\n if (allocPoint === 0n || v3Pool === zeroAddress) continue;\n const tokens = registry.tokens.get(chainName);\n const sym0 = tokens?.find(t => t.address.toLowerCase() === t0?.toLowerCase())?.symbol ?? t0?.slice(0, 8) ?? \"?\";\n const sym1 = tokens?.find(t => t.address.toLowerCase() === t1?.toLowerCase())?.symbol ?? t1?.slice(0, 8) ?? \"?\";\n // Compute APR: (allocPoint/totalAlloc) * cakePerSec * 86400 * 365 * cakePrice / poolTvl\n const cakePerDay = totalAlloc > 0n ? Number(cakePerSec * BigInt(allocPoint) * 86400n / totalAlloc) / 1e18 : 0;\n results.push({\n protocol: protocol.slug,\n pool: v3Pool,\n pair: `${sym0}/${sym1}`,\n type: \"EMISSION\",\n source: \"masterchef\",\n rewardRate: totalAlloc > 0n ? String(cakePerSec * BigInt(allocPoint) / totalAlloc) : \"0\",\n totalStaked: String(totalLiq),\n rewardToken: cakeAddr,\n rewardTokenSymbol: \"CAKE\",\n rewardPerDay: cakePerDay,\n } as DiscoveredPool);\n } catch { /* skip malformed pool */ }\n }\n } catch { /* masterchef query failed */ }\n }\n\n // Curve StableswapNG: enumerate via factory.pool_count + pool_list\n if (protocol.interface === \"curve_stableswap\" && protocol.contracts?.[\"stableswap_factory\"]) {\n const factory = protocol.contracts[\"stableswap_factory\"] as Address;\n const factoryAbi = parseAbi([\n \"function pool_count() view returns (uint256)\",\n \"function pool_list(uint256) view returns (address)\",\n ]);\n const poolAbi = parseAbi([\n \"function coins(uint256) view returns (address)\",\n \"function name() view returns (string)\",\n ]);\n const cClient = createPublicClient({ transport: http(rpcUrl) });\n try {\n const count = await cClient.readContract({ address: factory, abi: factoryAbi, functionName: \"pool_count\" }) as bigint;\n const MAX_SCAN = Math.min(Number(count), 50);\n for (let i = 0; i < MAX_SCAN; i++) {\n try {\n const pool = await cClient.readContract({ address: factory, abi: factoryAbi, functionName: \"pool_list\", args: [BigInt(i)] }) as Address;\n const [c0, c1, name] = await Promise.all([\n cClient.readContract({ address: pool, abi: poolAbi, functionName: \"coins\", args: [0n] }).catch(() => null) as Promise<Address | null>,\n cClient.readContract({ address: pool, abi: poolAbi, functionName: \"coins\", args: [1n] }).catch(() => null) as Promise<Address | null>,\n cClient.readContract({ address: pool, abi: poolAbi, functionName: \"name\" }).catch(() => \"\") as Promise<string>,\n ]);\n results.push({\n protocol: protocol.slug,\n pool,\n pair: name || `${c0 ?? \"?\"}/${c1 ?? \"?\"}`,\n type: \"FEE\",\n source: \"curve_factory\",\n } as DiscoveredPool);\n } catch { /* skip malformed pool */ }\n }\n } catch { /* factory query failed */ }\n }\n\n } catch {\n // Skip protocols that fail discovery (no adapter, missing contracts, etc.)\n }\n }),\n );\n\n // Compute APR for gauge pools with active rewardRate\n await _enrichGaugeAprs(results, rpcUrl, registry, chainName);\n\n // Sort by APR descending (puts top-yield pools first; pools with no APR sink to bottom)\n results.sort((a, b) => (b.aprPercent ?? 0) - (a.aprPercent ?? 0));\n if (opts.emissionOnly) {\n // Filter to pools that are actually distributing rewards right now (moePerDay > 0 OR rewardRate > 0)\n printOutput(\n results.filter((r) =>\n r.type === \"EMISSION\" &&\n ((r.moePerDay ?? 0) > 0 || (r.rewardRate && BigInt(r.rewardRate) > 0n)),\n ),\n getOpts(),\n );\n } else {\n printOutput(results, getOpts());\n }\n });\n\n // ─────────────────────────────────────────\n // lp add\n // ─────────────────────────────────────────\n lp.command(\"add\")\n .description(\"Add liquidity to a pool\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--token-a <token>\", \"First token symbol or address\")\n .requiredOption(\"--token-b <token>\", \"Second token symbol or address\")\n .requiredOption(\"--amount-a <amount>\", \"Amount of token A in wei\")\n .requiredOption(\"--amount-b <amount>\", \"Amount of token B in wei\")\n .option(\"--pool <name_or_address>\", \"Pool name (e.g. WHYPE/USDC) or address\")\n .option(\"--recipient <address>\", \"Recipient address\")\n .option(\"--tick-lower <tick>\", \"Lower tick for concentrated LP (default: full range)\")\n .option(\"--tick-upper <tick>\", \"Upper tick for concentrated LP (default: full range)\")\n .option(\"--range <percent>\", \"±N% concentrated range around current price (e.g. --range 2)\")\n .option(\"--num-bins <n>\", \"Merchant Moe LB: bins on each side of active (default 5)\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const protocol = registry.getProtocol(opts.protocol);\n const tokenA = opts.tokenA.startsWith(\"0x\")\n ? (opts.tokenA as Address)\n : registry.resolveToken(chainName, opts.tokenA).address as Address;\n const tokenB = opts.tokenB.startsWith(\"0x\")\n ? (opts.tokenB as Address)\n : registry.resolveToken(chainName, opts.tokenB).address as Address;\n const recipient = (opts.recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const poolAddr = opts.pool ? resolvePoolAddress(registry, opts.protocol, opts.pool) : undefined;\n\n // Merchant Moe LB add: distinct path from V2 — uses LBRouter.addLiquidity with bin distribution\n if (protocol.interface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n if (!poolAddr) throw new Error(\"--pool is required for Merchant Moe LB add\");\n const lbAdapter = createMerchantMoeLB(protocol, chain.effectiveRpcUrl());\n const [tokenX, tokenY, amountX, amountY] = tokenA.toLowerCase() < tokenB.toLowerCase()\n ? [tokenA, tokenB, BigInt(opts.amountA), BigInt(opts.amountB)]\n : [tokenB, tokenA, BigInt(opts.amountB), BigInt(opts.amountA)];\n const client = createPublicClient({ transport: http(chain.effectiveRpcUrl()) });\n const binStep = await client.readContract({\n address: poolAddr, abi: parseAbi([\"function getBinStep() view returns (uint16)\"]), functionName: \"getBinStep\",\n }) as number;\n const tx = await lbAdapter.buildAddLiquidity({\n pool: poolAddr,\n tokenX, tokenY, binStep,\n amountX, amountY,\n recipient,\n numBins: opts.numBins !== undefined ? parseInt(opts.numBins, 10) : 5,\n });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n return;\n }\n\n const adapter = createDex(protocol, chain.effectiveRpcUrl());\n const tx = await adapter.buildAddLiquidity({\n protocol: protocol.name,\n token_a: tokenA,\n token_b: tokenB,\n amount_a: BigInt(opts.amountA),\n amount_b: BigInt(opts.amountB),\n recipient,\n tick_lower: opts.tickLower !== undefined ? parseInt(opts.tickLower) : undefined,\n tick_upper: opts.tickUpper !== undefined ? parseInt(opts.tickUpper) : undefined,\n range_pct: opts.range !== undefined ? parseFloat(opts.range) : undefined,\n pool: poolAddr,\n });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n\n // ─────────────────────────────────────────\n // lp farm (add liquidity + auto-stake)\n // ─────────────────────────────────────────\n lp.command(\"farm\")\n .description(\"Add liquidity and auto-stake into gauge/farming for emissions\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--token-a <token>\", \"First token symbol or address\")\n .requiredOption(\"--token-b <token>\", \"Second token symbol or address\")\n .requiredOption(\"--amount-a <amount>\", \"Amount of token A in wei\")\n .requiredOption(\"--amount-b <amount>\", \"Amount of token B in wei\")\n .option(\"--pool <name_or_address>\", \"Pool name (e.g. WHYPE/USDC) or address\")\n .option(\"--gauge <address>\", \"Gauge address (required for solidly/hybra if not resolved automatically)\")\n .option(\"--recipient <address>\", \"Recipient / owner address\")\n .option(\"--tick-lower <tick>\", \"Lower tick for concentrated LP\")\n .option(\"--tick-upper <tick>\", \"Upper tick for concentrated LP\")\n .option(\"--range <percent>\", \"±N% concentrated range around current price\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const protocol = registry.getProtocol(opts.protocol);\n const rpcUrl = chain.effectiveRpcUrl();\n const recipient = (opts.recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const poolAddr = opts.pool ? resolvePoolAddress(registry, opts.protocol, opts.pool) : undefined;\n\n const tokenA = opts.tokenA.startsWith(\"0x\")\n ? (opts.tokenA as Address)\n : registry.resolveToken(chainName, opts.tokenA).address as Address;\n const tokenB = opts.tokenB.startsWith(\"0x\")\n ? (opts.tokenB as Address)\n : registry.resolveToken(chainName, opts.tokenB).address as Address;\n\n // Step 1: Add liquidity\n const dexAdapter = createDex(protocol, rpcUrl);\n const addTx = await dexAdapter.buildAddLiquidity({\n protocol: protocol.name,\n token_a: tokenA,\n token_b: tokenB,\n amount_a: BigInt(opts.amountA),\n amount_b: BigInt(opts.amountB),\n recipient,\n tick_lower: opts.tickLower !== undefined ? parseInt(opts.tickLower) : undefined,\n tick_upper: opts.tickUpper !== undefined ? parseInt(opts.tickUpper) : undefined,\n range_pct: opts.range !== undefined ? parseFloat(opts.range) : undefined,\n pool: poolAddr,\n });\n\n process.stderr.write(\"Step 1/2: Adding liquidity...\\n\");\n const addResult = await executor.execute(addTx);\n printOutput({ step: \"lp_add\", ...addResult }, getOpts());\n\n if (addResult.status !== \"confirmed\" && addResult.status !== \"simulated\") {\n process.stderr.write(\"Step 2/2: Skipped — LP add did not succeed.\\n\");\n return;\n }\n\n // Extract minted tokenId from result (broadcast mode populates minted_token_id)\n const mintedTokenId = addResult.details?.minted_token_id\n ? BigInt(addResult.details.minted_token_id as string)\n : undefined;\n\n // Step 2: Auto-stake based on protocol interface\n const iface = protocol.interface;\n\n // KittenSwap Algebra eternal farming\n if (iface === \"algebra_v3\" && protocol.contracts?.[\"farming_center\"]) {\n if (!mintedTokenId) {\n process.stderr.write(\"Step 2/2: Skipped staking (no tokenId — run in --broadcast mode to get minted NFT)\\n\");\n return;\n }\n if (!poolAddr) throw new Error(\"--pool is required for lp farm with KittenSwap (needed for farming center)\");\n process.stderr.write(\"Step 2/2: Staking into KittenSwap eternal farming...\\n\");\n const farmAdapter = createKittenSwapFarming(protocol, rpcUrl);\n const stakeTx = await farmAdapter.buildEnterFarming(mintedTokenId, poolAddr, recipient);\n const stakeResult = await executor.execute(stakeTx);\n printOutput({ step: \"stake_farming\", ...stakeResult }, getOpts());\n return;\n }\n\n // Solidly V2 / CL / Hybra / uniswap_v3-with-voter (Aerodrome Slipstream) gauge staking\n const isGaugeStakeable = [\"solidly_v2\", \"solidly_cl\", \"hybra\"].includes(iface)\n || (iface === \"uniswap_v3\" && protocol.contracts?.[\"voter\"]);\n if (isGaugeStakeable) {\n if (!mintedTokenId && iface !== \"solidly_v2\") {\n process.stderr.write(\"Step 2/2: Skipped staking (no tokenId — run in --broadcast mode to get minted NFT)\\n\");\n return;\n }\n\n let gaugeAddr = opts.gauge as Address | undefined;\n // Try to resolve gauge from pool address if not provided\n if (!gaugeAddr && poolAddr) {\n try {\n const gaugeAdapter = createGauge(protocol, rpcUrl);\n if (gaugeAdapter.resolveGauge) {\n gaugeAddr = await gaugeAdapter.resolveGauge(poolAddr);\n }\n } catch {\n // ignore\n }\n }\n if (!gaugeAddr) throw new Error(\"--gauge <address> is required for staking (could not auto-resolve gauge)\");\n\n process.stderr.write(\"Step 2/2: Staking into gauge...\\n\");\n const gaugeAdapter = createGauge(protocol, rpcUrl);\n // Hybra uses tokenId-based deposit; solidly_v2 uses amount.\n // Aerodrome V2 (and most Solidly forks) gauge.deposit reverts on uint256.max — query\n // user's actual LP balance and stake that exact amount.\n const tokenIdArg = mintedTokenId;\n let amountArg = 0n;\n if (iface === \"solidly_v2\" && poolAddr) {\n const erc20Abi = parseAbi([\"function balanceOf(address) view returns (uint256)\"]);\n const lpClient = createPublicClient({ transport: http(rpcUrl) });\n amountArg = await lpClient.readContract({\n address: poolAddr, abi: erc20Abi, functionName: \"balanceOf\", args: [recipient],\n }) as bigint;\n if (amountArg === 0n) {\n process.stderr.write(\"Step 2/2: Skipped staking — LP balance 0 (Step 1 add returned no LP).\\n\");\n return;\n }\n }\n // For solidly_v2, the LP token is the pool itself — pass poolAddr so approve is generated\n const lpTokenArg = iface === \"solidly_v2\" ? poolAddr : undefined;\n const stakeTx = await gaugeAdapter.buildDeposit(gaugeAddr, amountArg, tokenIdArg, lpTokenArg);\n const stakeResult = await executor.execute(stakeTx);\n printOutput({ step: \"stake_gauge\", ...stakeResult }, getOpts());\n return;\n }\n\n // Merchant Moe LB: no explicit staking needed (hooks auto-handle rewards)\n if (iface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n process.stderr.write(\"Step 2/2: Merchant Moe LB hooks handle rewards automatically — no staking needed.\\n\");\n return;\n }\n\n process.stderr.write(\"Step 2/2: No staking adapter found for this protocol interface — liquidity added only.\\n\");\n });\n\n // ─────────────────────────────────────────\n // lp claim\n // ─────────────────────────────────────────\n lp.command(\"claim\")\n .description(\"Claim rewards from a pool (fee or emission)\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .option(\"--pool <address>\", \"Pool address (required for farming/LB)\")\n .option(\"--gauge <address>\", \"Gauge contract address (required for solidly/hybra)\")\n .option(\"--token-id <id>\", \"NFT tokenId (for CL gauge or farming positions)\")\n .option(\"--bins <binIds>\", \"Comma-separated bin IDs (for Merchant Moe LB)\")\n .option(\"--address <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .option(\"--redeem-type <n>\", \"Hybra: 0=instant exit (with penalty), 1=lock into 2-year veHYBR (default)\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const rpcUrl = chain.effectiveRpcUrl();\n const protocol = registry.getProtocol(opts.protocol);\n const account = resolveAccount(opts.address, lp.opts<{ wallet?: string }>().wallet);\n const iface = protocol.interface;\n\n // V3 NPM.collect — used either when the whole protocol is fee-only\n // (e.g. swap-only V3 forks) OR when an auto_stake protocol's specific\n // pool has no gauge (caller passes --token-id without --gauge).\n const isV3Fee =\n protocol.reward_strategy === \"lp_fee_only\" ||\n (iface === \"uniswap_v3\" && opts.tokenId && !opts.gauge);\n if (isV3Fee) {\n if (!opts.tokenId) throw new Error(\"--token-id is required for V3 LP fee collection\");\n const adapter = createDex(protocol, rpcUrl);\n if (!(\"buildCollectFees\" in adapter) || typeof (adapter as { buildCollectFees?: unknown }).buildCollectFees !== \"function\") {\n throw new Error(`[${protocol.name}] adapter does not support buildCollectFees`);\n }\n const tx = await (adapter as { buildCollectFees: (tokenId: bigint, recipient: Address) => Promise<unknown> })\n .buildCollectFees(BigInt(opts.tokenId), account);\n const result = await executor.execute(tx as Parameters<typeof executor.execute>[0]);\n printOutput(result, getOpts());\n return;\n }\n\n // Off-chain claim (Nest): emissions read from blaze.nest.aegas.it / usenest.xyz.\n // The backend issues a signed claim ticket; we reproduce the byte-level\n // calldata pattern observed in successful onchain claims (template derived\n // from diffing two confirmed claim txs — only the ticket struct slots\n // differ between callers).\n if (protocol.reward_strategy === \"off_chain_api\") {\n const nest = createNestOffChain(protocol);\n const status = await nest.getClaimStatus(account);\n const ticket = await nest.getClaimTicket(account);\n if (!ticket) {\n printOutput({\n protocol: protocol.slug,\n wallet: account,\n voter: nest.getVoterAddress(),\n reward_symbol: \"NEST\",\n pending_amount: 0,\n note: \"No claim ticket available — backend reports no points to claim.\",\n }, getOpts());\n return;\n }\n const tx = await nest.buildClaim(account);\n\n // Pre-flight simulation gate: verify the voter accepts the calldata under\n // `from: account` before paying gas. Catches expired tickets, signature\n // mismatches, replay rejections, etc. without burning a tx.\n const preflightClient = createPublicClient({ transport: http(rpcUrl) });\n try {\n await preflightClient.call({\n account,\n to: tx.to as Address,\n data: tx.data as Hex,\n value: tx.value,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n printOutput({\n protocol: protocol.slug,\n wallet: account,\n voter: nest.getVoterAddress(),\n reward_symbol: \"NEST\",\n pending_amount: status.pendingFormatted,\n pending_raw: status.pendingRaw.toString(),\n ticket: {\n amount: ticket.amount.toString(),\n timestamp: ticket.timestamp.toString(),\n day: ticket.day === null ? null : ticket.day.toString(),\n signature: ticket.signature,\n },\n preflight: \"revert\",\n preflight_error: msg.length > 400 ? msg.slice(0, 400) + \"...\" : msg,\n broadcast: \"skipped\",\n note: \"Simulation reverted — broadcast aborted to avoid wasted gas. Common causes: ticket expired, caller != ticket signer, ticket already claimed.\",\n }, getOpts());\n return;\n }\n\n // Simulation passed → broadcast (or stay in dry-run if executor is configured that way)\n const result = await executor.execute(tx);\n printOutput({\n protocol: protocol.slug,\n wallet: account,\n voter: nest.getVoterAddress(),\n reward_symbol: \"NEST\",\n pending_amount: status.pendingFormatted,\n pending_raw: status.pendingRaw.toString(),\n total_claimed_raw: status.totalClaimedRaw.toString(),\n total_available_raw: status.totalAvailableRaw.toString(),\n ticket: {\n amount: ticket.amount.toString(),\n timestamp: ticket.timestamp.toString(),\n day: ticket.day === null ? null : ticket.day.toString(),\n signature: ticket.signature,\n },\n preflight: \"passed\",\n claim_result: result,\n note: \"Calldata derived from byte-level template (verified against two known-successful onchain claim txs). Pre-flight eth_call simulation passed before broadcast.\",\n }, getOpts());\n return;\n }\n\n // KittenSwap farming: collectRewards (collect + claim in one tx)\n if (iface === \"algebra_v3\" && protocol.contracts?.[\"farming_center\"]) {\n if (!opts.pool) throw new Error(\"--pool is required for KittenSwap farming claim\");\n if (!opts.tokenId) throw new Error(\"--token-id is required for KittenSwap farming claim\");\n const adapter = createKittenSwapFarming(protocol, rpcUrl);\n const tx = await adapter.buildCollectRewards(\n BigInt(opts.tokenId),\n opts.pool as Address,\n account,\n );\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n return;\n }\n\n // Merchant Moe LB claim\n if (iface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n if (!opts.pool) throw new Error(\"--pool is required for Merchant Moe LB claim\");\n const adapter = createMerchantMoeLB(protocol, rpcUrl);\n const binIds = opts.bins\n ? (opts.bins as string).split(\",\").map((s: string) => parseInt(s.trim()))\n : undefined;\n const tx = await adapter.buildClaimRewards(account, opts.pool as Address, binIds);\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n return;\n }\n\n // Solidly / Hybra gauge claim (including uniswap_v3 with voter)\n if ([\"solidly_v2\", \"solidly_cl\", \"algebra_v3\", \"hybra\"].includes(iface) ||\n (iface === \"uniswap_v3\" && protocol.contracts?.[\"voter\"])) {\n if (!opts.gauge) throw new Error(\"--gauge is required for gauge claim\");\n const adapter = createGauge(protocol, rpcUrl);\n type GaugeTx = Awaited<ReturnType<typeof adapter.buildClaimRewards>>;\n let tx: GaugeTx;\n // Ramses CL pattern: x(3,3) auto-stake on uniswap_v3 — claim must go through NPM\n // (gauge.getReward* reverts NOT_AUTHORIZED_CLAIMER for EOAs; only NPM/voter authorized).\n // We call NPM.getPeriodReward(currentEpoch, tokenId, tokens[], receiver).\n if (opts.tokenId &&\n iface === \"uniswap_v3\" &&\n protocol.reward_strategy === \"auto_stake\" &&\n \"buildClaimRewardsViaNPMPeriodReward\" in adapter &&\n typeof (adapter as { buildClaimRewardsViaNPMPeriodReward?: unknown }).buildClaimRewardsViaNPMPeriodReward === \"function\") {\n const npm = protocol.contracts?.[\"position_manager\"] as Address | undefined;\n if (!npm) throw new Error(`${protocol.name} requires contracts.position_manager for NPM-based claim`);\n tx = await (adapter as {\n buildClaimRewardsViaNPMPeriodReward: (\n npm: Address, tokenId: bigint, receiver: Address,\n opts?: { tokens?: Address[]; gauge?: Address; period?: bigint },\n ) => Promise<GaugeTx>;\n }).buildClaimRewardsViaNPMPeriodReward(\n npm,\n BigInt(opts.tokenId),\n account,\n { gauge: opts.gauge as Address },\n );\n } else if (opts.tokenId) {\n if (!adapter.buildClaimRewardsByTokenId) throw new Error(`${protocol.name} does not support NFT-based claim`);\n const claimOpts = opts.redeemType !== undefined\n ? { redeemType: parseInt(opts.redeemType, 10) }\n : undefined;\n tx = await (adapter as { buildClaimRewardsByTokenId: (gauge: Address, tokenId: bigint, opts?: { redeemType?: number }) => Promise<GaugeTx> })\n .buildClaimRewardsByTokenId(opts.gauge as Address, BigInt(opts.tokenId), claimOpts);\n } else {\n tx = await adapter.buildClaimRewards(opts.gauge as Address, account);\n }\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n return;\n }\n\n throw new Error(`No claim method found for protocol interface '${iface}'`);\n });\n\n // ─────────────────────────────────────────\n // lp pipeline (mint→stake→claim plan with optional inputs)\n // ─────────────────────────────────────────\n lp.command(\"pipeline\")\n .description(\"Show the mint→stake→claim sequence implied by a protocol's reward_strategy. Pass --token-a/-b/--amount-a/-b etc. to get fully-resolved CLI commands you can copy-paste.\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .option(\"--pool <pool>\", \"Pool name or address (e.g. WHYPE/USDC)\")\n .option(\"--token-a <token>\", \"First token symbol or address\")\n .option(\"--token-b <token>\", \"Second token symbol or address\")\n .option(\"--amount-a <amount>\", \"Amount of token A in wei\")\n .option(\"--amount-b <amount>\", \"Amount of token B in wei\")\n .option(\"--tick-lower <tick>\", \"Lower tick (V3/CL)\")\n .option(\"--tick-upper <tick>\", \"Upper tick (V3/CL)\")\n .option(\"--range <percent>\", \"±N% concentrated range\")\n .option(\"--token-id <id>\", \"NFT tokenId for already-minted positions (skips mint step)\")\n .option(\"--gauge <addr>\", \"Gauge address for stake/claim\")\n .action((opts) => {\n const registry = Registry.loadEmbedded();\n const protocol = registry.getProtocol(opts.protocol);\n const chainName = parent.opts<{ chain?: string }>().chain;\n const steps = buildPipelineSteps(protocol, {\n chain: chainName,\n pool: opts.pool,\n tokenA: opts.tokenA,\n tokenB: opts.tokenB,\n amountA: opts.amountA,\n amountB: opts.amountB,\n tickLower: opts.tickLower,\n tickUpper: opts.tickUpper,\n range: opts.range,\n tokenId: opts.tokenId,\n gauge: opts.gauge,\n });\n printOutput({\n protocol: protocol.slug,\n chain: protocol.chain,\n interface: protocol.interface,\n is_active: protocol.is_active !== false,\n verified: protocol.verified === true,\n reward_strategy: protocol.reward_strategy ?? \"(unset — falls back to interface inference)\",\n steps,\n note: \"Plan output. Run each cli_command sequentially. After the mint step, broadcast mode prints `details.minted_token_id` — feed that into the next step's --token-id.\",\n }, getOpts());\n });\n\n // ─────────────────────────────────────────\n // lp remove\n // ─────────────────────────────────────────\n lp.command(\"remove\")\n .description(\"Auto-unstake (if staked) and remove liquidity from a pool\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--token-a <token>\", \"First token symbol or address\")\n .requiredOption(\"--token-b <token>\", \"Second token symbol or address\")\n .requiredOption(\"--liquidity <amount>\", \"Liquidity amount to remove in wei\")\n .option(\"--pool <address>\", \"Pool address (needed to resolve gauge)\")\n .option(\"--gauge <address>\", \"Gauge contract address (for solidly/hybra unstake)\")\n .option(\"--token-id <id>\", \"NFT tokenId (for CL gauge or farming positions)\")\n .option(\"--recipient <address>\", \"Recipient address\")\n .option(\"--redeem-type <n>\", \"Hybra: 0=instant exit (with penalty), 1=lock into 2-year veHYBR (default — WARNING: long lock)\")\n .option(\"--bins <binIds>\", \"Merchant Moe LB: comma-separated bin IDs to withdraw\")\n .option(\"--amounts <wei>\", \"Merchant Moe LB: comma-separated bin amounts (parallel to --bins, default: full balance)\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const rpcUrl = chain.effectiveRpcUrl();\n const protocol = registry.getProtocol(opts.protocol);\n const iface = protocol.interface;\n const recipient = (opts.recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n\n // Merchant Moe LB remove: distinct path — uses LBRouter.removeLiquidity with per-bin amounts + ERC1155 approveForAll\n if (iface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n if (!opts.pool) throw new Error(\"--pool is required for Merchant Moe LB remove\");\n if (!opts.bins) throw new Error(\"--bins <id1,id2,...> is required for Merchant Moe LB remove\");\n const lbAdapter = createMerchantMoeLB(protocol, rpcUrl);\n const tokenA = opts.tokenA.startsWith(\"0x\")\n ? (opts.tokenA as Address)\n : registry.resolveToken(chainName, opts.tokenA).address as Address;\n const tokenB = opts.tokenB.startsWith(\"0x\")\n ? (opts.tokenB as Address)\n : registry.resolveToken(chainName, opts.tokenB).address as Address;\n const [tokenX, tokenY] = tokenA.toLowerCase() < tokenB.toLowerCase() ? [tokenA, tokenB] : [tokenB, tokenA];\n const binIds = (opts.bins as string).split(\",\").map((s) => parseInt(s.trim()));\n const client = createPublicClient({ transport: http(rpcUrl) });\n const binStep = await client.readContract({\n address: opts.pool as Address, abi: parseAbi([\"function getBinStep() view returns (uint16)\"]), functionName: \"getBinStep\",\n }) as number;\n let amounts: bigint[];\n if (opts.amounts) {\n amounts = (opts.amounts as string).split(\",\").map((s) => BigInt(s.trim()));\n } else {\n // Default: full balance per bin\n const balanceAbi = parseAbi([\"function balanceOf(address account, uint256 id) view returns (uint256)\"]);\n amounts = await Promise.all(binIds.map((id) =>\n client.readContract({ address: opts.pool as Address, abi: balanceAbi, functionName: \"balanceOf\", args: [recipient, BigInt(id)] }) as Promise<bigint>,\n ));\n }\n // Pre-tx: approveForAll(LBRouter, true) on the LBPair (ERC1155)\n const approveForAllAbi = parseAbi([\"function approveForAll(address operator, bool approved) external\"]);\n const lbRouter = protocol.contracts[\"lb_router\"] as Address;\n const approveTx = {\n description: `[${protocol.name}] approveForAll LBPair → LBRouter`,\n to: opts.pool as Address,\n data: encodeFunctionData({ abi: approveForAllAbi, functionName: \"approveForAll\", args: [lbRouter, true] }),\n value: 0n,\n gas_estimate: 80_000,\n };\n const tx = await lbAdapter.buildRemoveLiquidity({\n tokenX, tokenY, binStep,\n binIds, amounts,\n recipient,\n });\n tx.pre_txs = [approveTx, ...(tx.pre_txs ?? [])];\n const result = await executor.execute(tx);\n printOutput({ step: \"lb_remove\", ...result }, getOpts());\n return;\n }\n\n const tokenA = opts.tokenA.startsWith(\"0x\")\n ? (opts.tokenA as Address)\n : registry.resolveToken(chainName, opts.tokenA).address as Address;\n const tokenB = opts.tokenB.startsWith(\"0x\")\n ? (opts.tokenB as Address)\n : registry.resolveToken(chainName, opts.tokenB).address as Address;\n\n // Step 1: Unstake if applicable\n const poolAddr = opts.pool ? (opts.pool as Address) : undefined;\n let didUnstake = false;\n\n // KittenSwap farming exit\n if (iface === \"algebra_v3\" && protocol.contracts?.[\"farming_center\"] && opts.tokenId && poolAddr) {\n process.stderr.write(\"Step 1/2: Exiting KittenSwap farming...\\n\");\n const farmAdapter = createKittenSwapFarming(protocol, rpcUrl);\n const exitTx = await farmAdapter.buildExitFarming(BigInt(opts.tokenId), poolAddr);\n const exitResult = await executor.execute(exitTx);\n printOutput({ step: \"unstake_farming\", ...exitResult }, getOpts());\n if (exitResult.status !== \"confirmed\" && exitResult.status !== \"simulated\") {\n process.stderr.write(\"Step 2/2: Skipped — unstake did not succeed.\\n\");\n return;\n }\n didUnstake = true;\n }\n // Solidly / Hybra / uniswap_v3-with-voter (Aerodrome Slipstream) gauge withdraw\n else if ([\"solidly_v2\", \"solidly_cl\", \"hybra\"].includes(iface)\n || (iface === \"uniswap_v3\" && protocol.contracts?.[\"voter\"])) {\n let gaugeAddr = opts.gauge as Address | undefined;\n if (!gaugeAddr && poolAddr) {\n try {\n const gaugeAdapter = createGauge(protocol, rpcUrl);\n if (gaugeAdapter.resolveGauge) {\n gaugeAddr = await gaugeAdapter.resolveGauge(poolAddr);\n }\n } catch {\n // ignore\n }\n }\n if (gaugeAddr) {\n // Skip unstake if gauge balance is already 0 (e.g., user pre-unstaked manually)\n if (iface === \"solidly_v2\" && !opts.tokenId) {\n const erc20Abi = parseAbi([\"function balanceOf(address) view returns (uint256)\"]);\n const gClient = createPublicClient({ transport: http(rpcUrl) });\n const gaugeBal = await gClient.readContract({\n address: gaugeAddr, abi: erc20Abi, functionName: \"balanceOf\", args: [recipient],\n }) as bigint;\n if (gaugeBal === 0n) {\n process.stderr.write(\"Step 1/2: Skipped unstake — gauge balance 0 (already unstaked).\\n\");\n didUnstake = true; // mark as success to allow remove\n gaugeAddr = undefined; // skip the unstake block below\n }\n }\n }\n if (gaugeAddr) {\n process.stderr.write(\"Step 1/2: Withdrawing from gauge...\\n\");\n const gaugeAdapter = createGauge(protocol, rpcUrl);\n const tokenId = opts.tokenId ? BigInt(opts.tokenId) : undefined;\n const wOpts = opts.redeemType !== undefined ? { redeemType: parseInt(opts.redeemType, 10) } : undefined;\n if (iface === \"hybra\" && (!wOpts || wOpts.redeemType === 1)) {\n process.stderr.write(\"WARNING: Hybra default redeemType=1 locks rewards into 2-year veHYBR NFT. Pass --redeem-type 0 for instant exit (with penalty).\\n\");\n }\n const withdrawTx = await (gaugeAdapter as { buildWithdraw: (g: Address, a: bigint, t?: bigint, o?: { redeemType?: number }) => Promise<unknown> })\n .buildWithdraw(gaugeAddr, BigInt(opts.liquidity), tokenId, wOpts) as Awaited<ReturnType<typeof gaugeAdapter.buildWithdraw>>;\n const withdrawResult = await executor.execute(withdrawTx);\n printOutput({ step: \"unstake_gauge\", ...withdrawResult }, getOpts());\n if (withdrawResult.status !== \"confirmed\" && withdrawResult.status !== \"simulated\") {\n process.stderr.write(\"Step 2/2: Skipped — unstake did not succeed.\\n\");\n return;\n }\n didUnstake = true;\n }\n }\n\n if (!didUnstake) {\n process.stderr.write(\"Step 1/2: No staking detected — skipping unstake.\\n\");\n }\n\n // Step 2: Remove liquidity\n process.stderr.write(\"Step 2/2: Removing liquidity...\\n\");\n const dexAdapter = createDex(protocol, rpcUrl);\n const removeTx = await dexAdapter.buildRemoveLiquidity({\n protocol: protocol.name,\n token_a: tokenA,\n token_b: tokenB,\n liquidity: BigInt(opts.liquidity),\n recipient,\n token_id: opts.tokenId ? BigInt(opts.tokenId) : undefined,\n });\n const removeResult = await executor.execute(removeTx);\n printOutput({ step: \"lp_remove\", ...removeResult }, getOpts());\n });\n\n // ─────────────────────────────────────────\n // lp compound (collect fees → increaseLiquidity in one tx)\n // ─────────────────────────────────────────\n lp.command(\"compound\")\n .description(\"Auto-compound: collect accrued LP fees and immediately re-add them as liquidity (V3 fee-only protocols).\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--token-id <id>\", \"NFT tokenId of the position to compound\")\n .option(\"--address <address>\", \"Wallet/recipient address (defaults to DEFI_WALLET_ADDRESS)\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in basis points (default 50 = 0.5%). Sets amount0Min/amount1Min on increaseLiquidity to protect against MEV.\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const rpcUrl = chain.effectiveRpcUrl();\n const protocol = registry.getProtocol(opts.protocol);\n const recipient = resolveAccount(opts.address, lp.opts<{ wallet?: string }>().wallet);\n const adapter = createDex(protocol, rpcUrl);\n if (!(\"buildCompound\" in adapter) || typeof (adapter as { buildCompound?: unknown }).buildCompound !== \"function\") {\n throw new Error(`[${protocol.name}] adapter does not support compound (v1 supports V3 fee-only protocols)`);\n }\n const compoundOpts = opts.slippage !== undefined ? { slippageBps: parseInt(opts.slippage, 10) } : undefined;\n const tx = await (adapter as { buildCompound: (tokenId: bigint, recipient: Address, opts?: { slippageBps?: number }) => Promise<unknown> })\n .buildCompound(BigInt(opts.tokenId), recipient, compoundOpts);\n const result = await executor.execute(tx as Parameters<typeof executor.execute>[0]);\n printOutput(result, getOpts());\n });\n\n // ─────────────────────────────────────────\n // lp positions\n // ─────────────────────────────────────────\n lp.command(\"positions\")\n .description(\"Show all LP positions across protocols\")\n .option(\"--protocol <protocol>\", \"Filter to a single protocol slug\")\n .option(\"--pool <address>\", \"Filter to a specific pool address\")\n .option(\"--bins <binIds>\", \"Comma-separated bin IDs (for Merchant Moe LB, auto-detected if omitted)\")\n .option(\"--address <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .action(async (opts) => {\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const rpcUrl = chain.effectiveRpcUrl();\n const user = resolveAccount(opts.address, lp.opts<{ wallet?: string }>().wallet);\n\n const allProtocols = registry.getProtocolsForChain(chainName);\n const protocols = opts.protocol\n ? [registry.getProtocol(opts.protocol)]\n : allProtocols;\n\n const results: Array<Record<string, unknown>> = [];\n\n await Promise.allSettled(\n protocols.map(async (protocol) => {\n try {\n // Merchant Moe LB positions: scan all rewarded pools (no --pool) or one specific pool\n if (protocol.interface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n const adapter = createMerchantMoeLB(protocol, rpcUrl);\n const binIds = opts.bins\n ? (opts.bins as string).split(\",\").map((s: string) => parseInt(s.trim()))\n : undefined;\n const poolsToScan: Address[] = opts.pool\n ? [opts.pool as Address]\n : (await adapter.discoverRewardedPools()).map((p) => p.pool as Address);\n for (const poolAddr of poolsToScan) {\n try {\n const userBins = binIds ?? await adapter.findUserBinsWithBalance(poolAddr, user);\n if (userBins.length === 0) continue;\n const positions = await adapter.getUserPositions(user, poolAddr, userBins);\n if (positions.length === 0) continue;\n // Query pending MOE for these bins\n const pending = await adapter.getPendingRewards(user, poolAddr, userBins).catch(() => []);\n const totalPending = pending.reduce((s, r) => s + (r.amount ?? 0n), 0n);\n for (const pos of positions) {\n results.push({\n protocol: protocol.slug,\n type: \"lb\",\n pool: poolAddr,\n ...pos,\n pending_reward: totalPending.toString(),\n pending_reward_token: pending[0]?.token,\n });\n }\n } catch { /* skip pools the user has no balance in */ }\n }\n }\n\n // V3/Algebra/Hybra NFT positions via position_manager\n const npm = protocol.contracts?.[\"position_manager\"] as Address | undefined;\n if (npm && [\"uniswap_v3\", \"algebra_v3\", \"hybra\"].includes(protocol.interface)) {\n const npmAbi = parseAbi([\n \"function balanceOf(address owner) view returns (uint256)\",\n \"function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)\",\n ]);\n const client = createPublicClient({ transport: http(rpcUrl) });\n let count: bigint;\n try {\n count = await client.readContract({ address: npm, abi: npmAbi, functionName: \"balanceOf\", args: [user] }) as bigint;\n } catch { return; }\n const max = Math.min(Number(count), 50);\n for (let i = 0; i < max; i++) {\n try {\n const tokenId = await client.readContract({\n address: npm, abi: npmAbi, functionName: \"tokenOfOwnerByIndex\", args: [user, BigInt(i)],\n }) as bigint;\n // Try Ramses-CL layout (no nonce/operator) first; fallback to standard.\n const liq = await detectV3Liquidity(client, npm, tokenId);\n if (liq && liq.liquidity > 0n) {\n results.push({\n protocol: protocol.slug,\n type: \"v3_nft\",\n token_id: tokenId.toString(),\n token0: liq.token0,\n token1: liq.token1,\n liquidity: liq.liquidity.toString(),\n tickLower: liq.tickLower,\n tickUpper: liq.tickUpper,\n });\n }\n } catch { /* skip malformed */ }\n }\n }\n } catch {\n // Skip protocols that fail\n }\n }),\n );\n\n printOutput(results, getOpts());\n });\n\n // ─────────────────────────────────────────\n // lp autopilot\n // ─────────────────────────────────────────\n lp.command(\"autopilot\")\n .description(\"Auto-allocate budget across whitelisted pools (reads ~/.defi/pools.toml)\")\n .requiredOption(\"--budget <usd>\", \"Total budget in USD\")\n .option(\"--chain <chain>\", \"Filter whitelist to a specific chain\")\n .option(\"--dry-run\", \"Show plan only (default)\", true)\n .option(\"--broadcast\", \"Execute the plan (lending supply supported; LP types show a warning)\")\n .action(async (opts) => {\n const budgetUsd = parseFloat(opts.budget as string);\n if (isNaN(budgetUsd) || budgetUsd <= 0) {\n printOutput({ error: `Invalid budget: ${opts.budget}` }, getOpts());\n process.exit(1);\n return;\n }\n\n // Step 1: Load whitelist\n let whitelist = loadWhitelist();\n if (whitelist.length === 0) {\n printOutput(\n { error: \"No pools whitelisted. Create ~/.defi/pools.toml (see config/pools.example.toml)\" },\n getOpts(),\n );\n process.exit(1);\n return;\n }\n\n // Filter by --chain if specified\n const chainFilter = (opts.chain as string | undefined)?.toLowerCase();\n if (chainFilter) {\n whitelist = whitelist.filter((e) => e.chain.toLowerCase() === chainFilter);\n if (whitelist.length === 0) {\n printOutput(\n { error: `No whitelisted pools found for chain '${chainFilter}'` },\n getOpts(),\n );\n process.exit(1);\n return;\n }\n }\n\n // Step 2: Scan whitelisted pools — fetch current APY/APR for each entry\n const registry = Registry.loadEmbedded();\n\n interface ScannedEntry {\n entry: WhitelistEntry;\n apy?: number;\n apr?: number;\n active?: boolean;\n scan_error?: string;\n }\n\n const scanned: ScannedEntry[] = await Promise.all(\n whitelist.map(async (entry): Promise<ScannedEntry> => {\n try {\n const chainName = entry.chain.toLowerCase();\n let chain;\n try {\n chain = registry.getChain(chainName);\n } catch {\n return { entry, scan_error: `Unknown chain '${chainName}'` };\n }\n const rpcUrl = chain.effectiveRpcUrl();\n\n // Lending: fetch supply APY via getRates\n if (entry.type === \"lending\" && entry.asset) {\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter(\n (p) =>\n p.category === ProtocolCategory.Lending &&\n p.slug === entry.protocol,\n );\n if (protos.length === 0) {\n return { entry, scan_error: `Protocol not found: ${entry.protocol}` };\n }\n const proto = protos[0]!;\n const assetAddr = registry.resolveToken(chainName, entry.asset).address as Address;\n const adapter = createLending(proto, rpcUrl);\n const rates = await adapter.getRates(assetAddr);\n return { entry, apy: rates.supply_apy };\n }\n\n // LB: fetch APR from discoverRewardedPools\n if (entry.type === \"lb\" && entry.pool) {\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.slug === entry.protocol);\n if (protos.length === 0) {\n return { entry, scan_error: `Protocol not found: ${entry.protocol}` };\n }\n const proto = protos[0]!;\n if (proto.interface === \"uniswap_v2\" && proto.contracts?.[\"lb_factory\"]) {\n const adapter = createMerchantMoeLB(proto, rpcUrl);\n const pools = await adapter.discoverRewardedPools();\n // Match by pool name (pair) or address\n const match = pools.find(\n (p) =>\n p.pool.toLowerCase() === entry.pool!.toLowerCase() ||\n `${p.symbolX}/${p.symbolY}`.toLowerCase() === entry.pool!.toLowerCase() ||\n `${p.symbolY}/${p.symbolX}`.toLowerCase() === entry.pool!.toLowerCase(),\n );\n if (match) {\n return { entry, apr: match.aprPercent, active: !match.stopped };\n }\n }\n return { entry, scan_error: \"Pool not found in LB discovery\" };\n }\n\n // Farming: fetch active status from discoverFarmingPools\n if (entry.type === \"farming\" && entry.pool) {\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.slug === entry.protocol);\n if (protos.length === 0) {\n return { entry, scan_error: `Protocol not found: ${entry.protocol}` };\n }\n const proto = protos[0]!;\n if (proto.interface === \"algebra_v3\" && proto.contracts?.[\"farming_center\"]) {\n const adapter = createKittenSwapFarming(proto, rpcUrl);\n const pools = await adapter.discoverFarmingPools();\n const match = pools.find(\n (p) => p.pool.toLowerCase() === entry.pool!.toLowerCase(),\n );\n if (match) {\n return { entry, active: match.active };\n }\n }\n return { entry, scan_error: \"Pool not found in farming discovery\" };\n }\n\n // Gauge: check if gauge exists\n if (entry.type === \"gauge\" && entry.pool) {\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.slug === entry.protocol);\n if (protos.length === 0) {\n return { entry, scan_error: `Protocol not found: ${entry.protocol}` };\n }\n const proto = protos[0]!;\n if ([\"solidly_v2\", \"solidly_cl\", \"algebra_v3\", \"hybra\"].includes(proto.interface) ||\n (proto.interface === \"uniswap_v3\" && proto.contracts?.[\"voter\"])) {\n const chainTokens = registry.tokens.get(chainName)?.map(t => t.address);\n const adapter = createGauge(proto, rpcUrl, chainTokens);\n if (adapter.discoverGaugedPools) {\n const pools = await adapter.discoverGaugedPools();\n const poolAddr = entry.pool.startsWith(\"0x\")\n ? entry.pool.toLowerCase()\n : undefined;\n const match = pools.find(\n (p) =>\n (poolAddr && p.pool.toLowerCase() === poolAddr) ||\n `${p.token0}/${p.token1}`.toLowerCase() === entry.pool!.toLowerCase() ||\n `${p.token1}/${p.token0}`.toLowerCase() === entry.pool!.toLowerCase(),\n );\n return { entry, active: !!match };\n }\n }\n return { entry, scan_error: \"Gauge discovery not supported for this protocol\" };\n }\n\n return { entry, scan_error: \"Unsupported entry type or missing pool/asset field\" };\n } catch (err) {\n return { entry, scan_error: String(err) };\n }\n }),\n );\n\n // Step 3: Generate allocation plan\n // Reserve 20% of budget as safety margin\n const RESERVE_PCT = 0.20;\n const deployableBudget = budgetUsd * (1 - RESERVE_PCT);\n const reserveUsd = budgetUsd * RESERVE_PCT;\n\n // Sort by yield: lending/lb by APY/APR descending, farming/gauge by active first\n const ranked = [...scanned].sort((a, b) => {\n const scoreA = a.apy ?? a.apr ?? (a.active ? 1 : 0);\n const scoreB = b.apy ?? b.apr ?? (b.active ? 1 : 0);\n return scoreB - scoreA;\n });\n\n // Allocate respecting max_allocation_pct per entry\n const allocations: Array<Record<string, unknown>> = [];\n let remainingBudget = deployableBudget;\n\n for (const s of ranked) {\n if (remainingBudget <= 0) break;\n const maxAlloc = budgetUsd * (s.entry.max_allocation_pct / 100);\n const alloc = Math.min(maxAlloc, remainingBudget);\n if (alloc <= 0) continue;\n\n const item: Record<string, unknown> = {\n protocol: s.entry.protocol,\n chain: s.entry.chain,\n type: s.entry.type,\n amount_usd: Math.round(alloc * 100) / 100,\n };\n if (s.entry.pool) item[\"pool\"] = s.entry.pool;\n if (s.entry.asset) item[\"asset\"] = s.entry.asset;\n if (s.apy !== undefined) item[\"apy\"] = s.apy;\n if (s.apr !== undefined) item[\"apr\"] = s.apr;\n if (s.active !== undefined) item[\"active\"] = s.active;\n if (s.scan_error) item[\"scan_error\"] = s.scan_error;\n\n allocations.push(item);\n remainingBudget -= alloc;\n }\n\n // Add reserve entry\n const totalReserved = reserveUsd + remainingBudget;\n allocations.push({\n reserve: true,\n amount_usd: Math.round(totalReserved * 100) / 100,\n note: \"20% safety margin (hardcoded) + unallocated remainder\",\n });\n\n // Estimate daily/annual yield\n let estimatedAnnualYieldUsd = 0;\n for (const alloc of allocations) {\n if (alloc[\"reserve\"]) continue;\n const amt = alloc[\"amount_usd\"] as number;\n const rate = (alloc[\"apy\"] as number | undefined) ?? (alloc[\"apr\"] as number | undefined);\n if (rate !== undefined && rate > 0) {\n // APY/APR are stored as decimal fractions (e.g. 0.0888 = 8.88%) or percentages (873 = 873%)\n // Use as-is: yield.ts stores supply_apy as a decimal fraction from the protocol adapter\n estimatedAnnualYieldUsd += amt * rate;\n }\n }\n const estimatedDailyYieldUsd = estimatedAnnualYieldUsd / 365;\n\n const isBroadcast = !!(opts.broadcast as boolean | undefined);\n\n const plan = {\n budget_usd: budgetUsd,\n deployable_usd: Math.round(deployableBudget * 100) / 100,\n reserve_pct: RESERVE_PCT * 100,\n allocations,\n estimated_daily_yield_usd: Math.round(estimatedDailyYieldUsd * 100) / 100,\n estimated_annual_yield_usd: Math.round(estimatedAnnualYieldUsd * 100) / 100,\n execution: isBroadcast ? \"broadcast\" : \"dry_run\",\n };\n\n printOutput(plan, getOpts());\n\n if (!isBroadcast) return;\n\n // Step 4: Execute the plan\n process.stderr.write(\"\\nExecuting autopilot plan...\\n\");\n const executor = makeExecutor();\n const execResults: Array<Record<string, unknown>> = [];\n let allocIndex = 0;\n const actionAllocs = allocations.filter((a) => !a[\"reserve\"]);\n\n for (const alloc of actionAllocs) {\n allocIndex++;\n const chainName = (alloc[\"chain\"] as string).toLowerCase();\n let chain;\n try {\n chain = registry.getChain(chainName);\n } catch {\n process.stderr.write(`\\n--- ${allocIndex}/${actionAllocs.length}: ${alloc[\"protocol\"]} — unknown chain '${chainName}', skipping ---\\n`);\n execResults.push({ ...alloc, exec_status: \"skipped\", exec_error: `Unknown chain '${chainName}'` });\n continue;\n }\n const rpc = chain.effectiveRpcUrl();\n\n process.stderr.write(`\\n--- ${allocIndex}/${actionAllocs.length}: ${alloc[\"protocol\"]} (${alloc[\"type\"]}) $${alloc[\"amount_usd\"]} ---\\n`);\n\n if (alloc[\"type\"] === \"lending\" && alloc[\"asset\"]) {\n try {\n const protocol = registry.getProtocol(alloc[\"protocol\"] as string);\n const adapter = createLending(protocol, rpc);\n const tokenInfo = registry.resolveToken(chainName, alloc[\"asset\"] as string);\n const assetAddr = tokenInfo.address as Address;\n const decimals = tokenInfo.decimals ?? 18;\n const amountWei = BigInt(Math.floor((alloc[\"amount_usd\"] as number) * 10 ** decimals));\n const wallet = resolveAccount(undefined, lp.opts<{ wallet?: string }>().wallet);\n const tx = await adapter.buildSupply({\n protocol: alloc[\"protocol\"] as string,\n asset: assetAddr,\n amount: amountWei,\n on_behalf_of: wallet,\n });\n process.stderr.write(` Supplying ${amountWei} wei of ${alloc[\"asset\"]} to ${alloc[\"protocol\"]}...\\n`);\n const result = await executor.execute(tx);\n process.stderr.write(` Status: ${result.status}\\n`);\n const explorerUrl = result.details?.[\"explorer_url\"];\n if (explorerUrl) process.stderr.write(` Explorer: ${explorerUrl}\\n`);\n execResults.push({ ...alloc, exec_status: result.status, tx_hash: result.tx_hash });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(` Error: ${msg}\\n`);\n execResults.push({ ...alloc, exec_status: \"error\", exec_error: msg });\n }\n continue;\n }\n\n // LP / LB / farming / gauge: require manual token preparation for now\n const lpMsg = `LP execution for type '${alloc[\"type\"]}' pool '${alloc[\"pool\"] ?? \"\"}' — requires manual token preparation (swap + addLiquidity not yet automated)`;\n process.stderr.write(` Warning: ${lpMsg}\\n`);\n execResults.push({ ...alloc, exec_status: \"skipped\", exec_note: lpMsg });\n }\n\n process.stderr.write(\"\\nAutopilot execution complete.\\n\");\n printOutput({ execution_results: execResults }, getOpts());\n });\n}\n","import { readFileSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { parse } from \"smol-toml\";\n\nexport interface WhitelistEntry {\n chain: string;\n protocol: string;\n pool?: string; // pool name or address (for LP)\n asset?: string; // asset symbol (for lending)\n type: \"lb\" | \"gauge\" | \"farming\" | \"lending\";\n max_allocation_pct: number;\n}\n\nexport function loadWhitelist(): WhitelistEntry[] {\n const path = resolve(process.env[\"HOME\"] ?? \"~\", \".defi\", \"pools.toml\");\n try {\n const raw = readFileSync(path, \"utf-8\");\n const parsed = parse(raw) as { whitelist?: WhitelistEntry[] };\n return parsed.whitelist ?? [];\n } catch {\n return []; // No whitelist file = empty\n }\n}\n","import type { Address } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { OwsEvmSigner } from \"./ows-evm.js\";\n\n/**\n * Determine signing method: OWS vault, private key, or address-only.\n *\n * Priority:\n * 1. Explicit --wallet flag -> OWS signer\n * 2. DEFI_WALLET_ADDRESS starting with \"ows:\" -> OWS signer\n * 3. DEFI_PRIVATE_KEY -> derive address (signer = null, executor uses key directly)\n * 4. DEFI_WALLET_ADDRESS -> address-only (read-only / dry-run)\n */\nexport function resolveWalletWithSigner(\n opts?: { wallet?: string; passphrase?: string },\n): { address: Address; signer: OwsEvmSigner | null } {\n // 1. Explicit --wallet flag\n if (opts?.wallet) {\n const signer = OwsEvmSigner.create(opts.wallet, opts.passphrase);\n return { address: signer.getAddress() as Address, signer };\n }\n\n // 2. DEFI_WALLET_ADDRESS with \"ows:\" prefix\n const envWallet = process.env[\"DEFI_WALLET_ADDRESS\"];\n if (envWallet?.startsWith(\"ows:\")) {\n const walletName = envWallet.slice(4);\n const signer = OwsEvmSigner.create(walletName);\n return { address: signer.getAddress() as Address, signer };\n }\n\n // 3. DEFI_PRIVATE_KEY -> derive address\n const pk = process.env[\"DEFI_PRIVATE_KEY\"];\n if (pk) {\n return { address: privateKeyToAccount(pk as `0x${string}`).address, signer: null };\n }\n\n // 4. Plain DEFI_WALLET_ADDRESS\n if (envWallet) {\n return { address: envWallet as Address, signer: null };\n }\n\n throw new Error(\n \"No wallet configured. Use --wallet <name>, set DEFI_WALLET_ADDRESS, or set DEFI_PRIVATE_KEY\",\n );\n}\n","import { createRequire } from \"node:module\";\n\nconst _require = createRequire(import.meta.url);\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/** Lazy-load the OWS native module (NAPI binding, requires CJS require). */\nexport function loadOws(): any {\n try {\n return _require(\"@open-wallet-standard/core\");\n } catch {\n throw new Error(\n \"OWS not installed. Run: curl -fsSL https://docs.openwallet.sh/install.sh | bash\",\n );\n }\n}\n","import { loadOws } from \"./ows-loader.js\";\n\n/**\n * EVM signer backed by Open Wallet Standard.\n * Keys never leave the OWS encrypted vault.\n */\nexport class OwsEvmSigner {\n private _address: string;\n private _walletName: string;\n private _passphrase: string;\n\n private constructor(walletName: string, address: string, passphrase: string) {\n this._walletName = walletName;\n this._address = address;\n this._passphrase = passphrase;\n }\n\n static create(walletName: string, passphrase = \"\"): OwsEvmSigner {\n const ows = loadOws();\n const wallet = ows.getWallet(walletName);\n const evmAccount = wallet.accounts.find(\n (a: { chainId: string }) => a.chainId.startsWith(\"eip155:\"),\n );\n if (!evmAccount) {\n throw new Error(`OWS wallet \"${walletName}\" has no EVM account`);\n }\n return new OwsEvmSigner(walletName, evmAccount.address, passphrase);\n }\n\n getAddress(): string {\n return this._address;\n }\n\n async signTypedData(\n domain: Record<string, unknown>,\n types: Record<string, Array<{ name: string; type: string }>>,\n value: Record<string, unknown>,\n ): Promise<string> {\n const ows = loadOws();\n\n const typedData = JSON.stringify({\n types: {\n EIP712Domain: Object.keys(domain).map((key) => ({\n name: key,\n type: inferEip712DomainType(key),\n })),\n ...types,\n },\n primaryType: Object.keys(types)[0],\n domain,\n message: value,\n });\n\n const result = ows.signTypedData(this._walletName, \"evm\", typedData, this._passphrase);\n\n const sig = result.signature.startsWith(\"0x\") ? result.signature : `0x${result.signature}`;\n const v = result.recoveryId !== undefined ? result.recoveryId + 27 : 27;\n return `${sig}${v.toString(16).padStart(2, \"0\")}`;\n }\n\n async signMessage(message: string | Uint8Array): Promise<string> {\n const ows = loadOws();\n\n const msgStr = typeof message === \"string\"\n ? message\n : Buffer.from(message).toString(\"hex\");\n const encoding = typeof message === \"string\" ? \"utf8\" : \"hex\";\n\n const result = ows.signMessage(this._walletName, \"evm\", msgStr, this._passphrase, encoding);\n\n const sig = result.signature.startsWith(\"0x\") ? result.signature : `0x${result.signature}`;\n const v = result.recoveryId !== undefined ? result.recoveryId + 27 : 27;\n return `${sig}${v.toString(16).padStart(2, \"0\")}`;\n }\n\n /**\n * Sign a raw serialized transaction for viem compatibility.\n * Returns the signed transaction as a hex string.\n */\n async signTransaction(serializedTx: string): Promise<string> {\n const ows = loadOws();\n\n const txHex = serializedTx.startsWith(\"0x\") ? serializedTx.slice(2) : serializedTx;\n const result = ows.signMessage(this._walletName, \"evm\", txHex, this._passphrase, \"hex\");\n\n const sig = result.signature.startsWith(\"0x\") ? result.signature : `0x${result.signature}`;\n const v = result.recoveryId !== undefined ? result.recoveryId + 27 : 27;\n return `${sig}${v.toString(16).padStart(2, \"0\")}`;\n }\n}\n\nfunction inferEip712DomainType(key: string): string {\n switch (key) {\n case \"chainId\": return \"uint256\";\n case \"verifyingContract\": return \"address\";\n case \"salt\": return \"bytes32\";\n default: return \"string\";\n }\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport type { Executor } from \"../executor.js\";\nimport { printOutput } from \"../output.js\";\nimport { InterestRateMode } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\nimport { createLending } from \"@hypurrquant/defi-protocols\";\nimport { resolveContext, resolveTokenAddress, resolveWallet } from \"../utils.js\";\n\nexport function registerLending(parent: Command, getOpts: () => OutputMode, makeExecutor: () => Executor): void {\n const lending = parent.command(\"lending\").description(\"Lending operations: supply, borrow, repay, withdraw, rates, position\");\n\n lending.command(\"rates\")\n .description(\"Show current lending rates\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .action(async (opts) => {\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const asset = resolveTokenAddress(ctx.registry, ctx.chainName, opts.asset);\n const rates = await adapter.getRates(asset);\n printOutput(rates, getOpts());\n });\n\n lending.command(\"position\")\n .description(\"Show current lending position\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--address <address>\", \"Wallet address to query\")\n .action(async (opts) => {\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const position = await adapter.getUserPosition(opts.address as Address);\n printOutput(position, getOpts());\n });\n\n lending.command(\"supply\")\n .description(\"Supply an asset to a lending protocol\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount to supply in wei\")\n .option(\"--on-behalf-of <address>\", \"On behalf of address\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const asset = resolveTokenAddress(ctx.registry, ctx.chainName, opts.asset);\n const onBehalfOf = resolveWallet(opts.onBehalfOf);\n const tx = await adapter.buildSupply({ protocol: ctx.protocol!.name, asset, amount: BigInt(opts.amount), on_behalf_of: onBehalfOf });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n\n lending.command(\"borrow\")\n .description(\"Borrow an asset\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount in wei\")\n .option(\"--rate-mode <mode>\", \"variable or stable\", \"variable\")\n .option(\"--on-behalf-of <address>\", \"On behalf of address\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const asset = resolveTokenAddress(ctx.registry, ctx.chainName, opts.asset);\n const onBehalfOf = resolveWallet(opts.onBehalfOf);\n const tx = await adapter.buildBorrow({\n protocol: ctx.protocol!.name, asset, amount: BigInt(opts.amount),\n interest_rate_mode: opts.rateMode === \"stable\" ? InterestRateMode.Stable : InterestRateMode.Variable,\n on_behalf_of: onBehalfOf,\n });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n\n lending.command(\"repay\")\n .description(\"Repay a borrowed asset\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount in wei\")\n .option(\"--rate-mode <mode>\", \"variable or stable\", \"variable\")\n .option(\"--on-behalf-of <address>\", \"On behalf of address\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const asset = resolveTokenAddress(ctx.registry, ctx.chainName, opts.asset);\n const onBehalfOf = resolveWallet(opts.onBehalfOf);\n const tx = await adapter.buildRepay({\n protocol: ctx.protocol!.name, asset, amount: BigInt(opts.amount),\n interest_rate_mode: opts.rateMode === \"stable\" ? InterestRateMode.Stable : InterestRateMode.Variable,\n on_behalf_of: onBehalfOf,\n });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n\n lending.command(\"withdraw\")\n .description(\"Withdraw a supplied asset\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount in wei\")\n .option(\"--to <address>\", \"Recipient address\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const asset = resolveTokenAddress(ctx.registry, ctx.chainName, opts.asset);\n const to = resolveWallet(opts.to);\n const tx = await adapter.buildWithdraw({ protocol: ctx.protocol!.name, asset, amount: BigInt(opts.amount), to });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n}\n","import type { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport type { OutputMode } from \"./output.js\";\nimport { printOutput } from \"./output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport type { ProtocolEntry, ChainConfig } from \"@hypurrquant/defi-core\";\nimport { resolveWalletWithSigner } from \"./signer/resolve.js\";\n\n// ── Chain validation ──\n\n/**\n * Get chain name from global --chain option, or null with error output if missing.\n * For commands that require a specific chain (transactions, single-chain queries).\n */\nexport function requireChain(parent: Command, getOpts: () => OutputMode): string | null {\n const chain = parent.opts<{ chain?: string }>().chain;\n if (!chain) {\n printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts());\n return null;\n }\n return chain.toLowerCase();\n}\n\n/**\n * Get chain name if explicitly passed, or all chain keys if not.\n * For commands that scan all chains by default (yield, status).\n */\nexport function getChainKeys(parent: Command, registry: Registry): string[] {\n const chain = parent.opts<{ chain?: string }>().chain;\n return chain ? [chain.toLowerCase()] : Array.from(registry.chains.keys());\n}\n\n// ── Context resolution ──\n\nexport interface CommandContext {\n chainName: string;\n registry: Registry;\n chain: ChainConfig;\n rpcUrl: string;\n protocol?: ProtocolEntry;\n}\n\n/**\n * Resolve chain + registry + optional protocol in one call.\n * Returns null (with error output) if --chain is missing.\n */\nexport function resolveContext(\n parent: Command,\n getOpts: () => OutputMode,\n protocolSlug?: string,\n): CommandContext | null {\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return null;\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const protocol = protocolSlug ? registry.getProtocol(protocolSlug) : undefined;\n return { chainName, registry, chain, rpcUrl: chain.effectiveRpcUrl(), protocol };\n}\n\n// ── Token resolution ──\n\n/**\n * Resolve token symbol or address to Address.\n */\nexport function resolveTokenAddress(registry: Registry, chainName: string, tokenOrAddress: string): Address {\n if (/^0x[0-9a-fA-F]{40}$/.test(tokenOrAddress)) return tokenOrAddress as Address;\n return registry.resolveToken(chainName, tokenOrAddress).address;\n}\n\n// ── Wallet address ──\n\nconst FALLBACK_ADDRESS = \"0x0000000000000000000000000000000000000001\" as Address;\n\n/**\n * Resolve wallet address from explicit option, env var (including OWS), or fallback.\n */\nexport function resolveWallet(override?: string): Address {\n if (override) return override as Address;\n try {\n const { address } = resolveWalletWithSigner();\n return address;\n } catch {\n return FALLBACK_ADDRESS;\n }\n}\n\n// ── Error formatting ──\n\n/**\n * Extract error message from unknown error.\n */\nexport function errMsg(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\n// ── Value parsing ──\n\n/**\n * Parse a hex or decimal string to BigInt (for tx value fields).\n */\nexport function parseBigIntValue(v: string): bigint {\n return v.startsWith(\"0x\") ? BigInt(v) : BigInt(v || 0);\n}\n","import type { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { Registry, ProtocolCategory } from \"@hypurrquant/defi-core\";\nimport type { LendingRates } from \"@hypurrquant/defi-core\";\nimport { createLending, createVault } from \"@hypurrquant/defi-protocols\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport type { Executor } from \"../executor.js\";\n\nfunction resolveAsset(registry: Registry, chain: string, asset: string): Address {\n // Try parsing as address first\n if (/^0x[0-9a-fA-F]{40}$/.test(asset)) {\n return asset as Address;\n }\n return registry.resolveToken(chain, asset).address;\n}\n\n/** Collect lending rates for all lending protocols */\nasync function collectLendingRates(\n registry: Registry,\n chainName: string,\n rpc: string,\n assetAddr: Address,\n): Promise<LendingRates[]> {\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending);\n\n const results: LendingRates[] = [];\n let first = true;\n\n for (const proto of protos) {\n if (!first) {\n // Small delay between calls to avoid rate limiting\n await new Promise((r) => setTimeout(r, 500));\n }\n first = false;\n\n try {\n const lending = createLending(proto, rpc);\n const rates = await lending.getRates(assetAddr);\n results.push(rates);\n } catch (err) {\n process.stderr.write(`Warning: ${proto.name} rates unavailable: ${err}\\n`);\n }\n }\n\n return results;\n}\n\n/** Collect all yield opportunities: lending + morpho + vaults */\nasync function collectAllYields(\n registry: Registry,\n chainName: string,\n rpc: string,\n asset: string,\n assetAddr: Address,\n): Promise<unknown[]> {\n const opportunities: unknown[] = [];\n\n // 1. Aave V3 lending rates\n const lendingRates = await collectLendingRates(registry, chainName, rpc, assetAddr);\n for (const r of lendingRates) {\n if (r.supply_apy > 0) {\n opportunities.push({\n protocol: r.protocol,\n type: \"lending_supply\",\n asset,\n apy: r.supply_apy,\n utilization: r.utilization,\n });\n }\n }\n\n // 2. Morpho Blue rates\n const chainProtos = registry.getProtocolsForChain(chainName);\n for (const proto of chainProtos) {\n if (proto.category === ProtocolCategory.Lending && proto.interface === \"morpho_blue\") {\n try {\n const lending = createLending(proto, rpc);\n const rates = await lending.getRates(assetAddr);\n if (rates.supply_apy > 0) {\n opportunities.push({\n protocol: rates.protocol,\n type: \"morpho_vault\",\n asset,\n apy: rates.supply_apy,\n utilization: rates.utilization,\n });\n }\n } catch {\n // skip\n }\n }\n }\n\n // 3. ERC-4626 vaults\n for (const proto of chainProtos) {\n if (proto.category === ProtocolCategory.Vault && proto.interface === \"erc4626\") {\n try {\n const vault = createVault(proto, rpc);\n const info = await vault.getVaultInfo();\n opportunities.push({\n protocol: info.protocol,\n type: \"vault\",\n asset,\n apy: info.apy ?? 0,\n total_assets: info.total_assets.toString(),\n });\n } catch {\n // skip\n }\n }\n }\n\n // Sort by APY descending\n opportunities.sort((a, b) => {\n const aa = (a as Record<string, unknown>)[\"apy\"] as number ?? 0;\n const ba = (b as Record<string, unknown>)[\"apy\"] as number ?? 0;\n return ba - aa;\n });\n\n return opportunities;\n}\n\n/** Scan all chains in parallel for best yield on an asset */\nasync function runYieldScan(registry: Registry, asset: string, output: OutputMode): Promise<void> {\n const t0 = Date.now();\n const chainKeys = Array.from(registry.chains.keys());\n\n const tasks = chainKeys.map(async (ck) => {\n try {\n const chain = registry.getChain(ck);\n const chainName = chain.name.toLowerCase();\n\n let assetAddr: Address;\n try {\n assetAddr = registry.resolveToken(chainName, asset).address;\n } catch {\n return [];\n }\n\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending);\n\n if (protos.length === 0) return [];\n\n const rpc = chain.effectiveRpcUrl();\n const rates: unknown[] = [];\n\n for (const proto of protos) {\n try {\n const lending = createLending(proto, rpc);\n const r = await lending.getRates(assetAddr);\n if (r.supply_apy > 0) {\n rates.push({\n chain: chain.name,\n protocol: r.protocol,\n supply_apy: r.supply_apy,\n borrow_variable_apy: r.borrow_variable_apy,\n });\n }\n } catch {\n // skip\n }\n }\n\n return rates;\n } catch {\n return [];\n }\n });\n\n const nested = await Promise.all(tasks);\n const allRates = nested.flat() as Array<Record<string, unknown>>;\n\n // Sort by supply APY descending\n allRates.sort((a, b) => (b[\"supply_apy\"] as number ?? 0) - (a[\"supply_apy\"] as number ?? 0));\n\n const best =\n allRates.length > 0\n ? `${allRates[0][\"protocol\"]} on ${allRates[0][\"chain\"]}`\n : null;\n\n // Find arb opportunities (supply on A, borrow on B)\n const arbs: unknown[] = [];\n for (const s of allRates) {\n for (const b of allRates) {\n const sp = s[\"supply_apy\"] as number ?? 0;\n const bp = b[\"borrow_variable_apy\"] as number ?? 0;\n if (sp > bp && bp > 0) {\n const sc = s[\"chain\"] as string;\n const bc = b[\"chain\"] as string;\n const sp2 = s[\"protocol\"] as string;\n const bp2 = b[\"protocol\"] as string;\n if (sc !== bc || sp2 !== bp2) {\n arbs.push({\n spread_pct: Math.round((sp - bp) * 100) / 100,\n supply_chain: sc,\n supply_protocol: sp2,\n supply_apy: sp,\n borrow_chain: bc,\n borrow_protocol: bp2,\n borrow_apy: bp,\n strategy: sc === bc ? \"same-chain\" : \"cross-chain\",\n });\n }\n }\n }\n }\n\n arbs.sort((a, b) => {\n const as_ = (a as Record<string, unknown>)[\"spread_pct\"] as number ?? 0;\n const bs_ = (b as Record<string, unknown>)[\"spread_pct\"] as number ?? 0;\n return bs_ - as_;\n });\n arbs.splice(10); // Top 10\n\n printOutput(\n {\n asset,\n scan_duration_ms: Date.now() - t0,\n chains_scanned: chainKeys.length,\n rates: allRates,\n best_supply: best,\n arb_opportunities: arbs,\n },\n output,\n );\n}\n\n/** Scan rate entry with slug for execute subcommand */\ninterface ScanRate {\n chain: string;\n protocol: string;\n slug: string;\n supply_apy: number;\n borrow_variable_apy: number;\n}\n\n/** Run a cross-chain yield scan and return typed rate entries */\nasync function scanRatesForExecute(registry: Registry, asset: string): Promise<ScanRate[]> {\n const chainKeys = Array.from(registry.chains.keys());\n\n const tasks = chainKeys.map(async (ck): Promise<ScanRate[]> => {\n try {\n const chain = registry.getChain(ck);\n const chainName = chain.name.toLowerCase();\n let assetAddr: Address;\n try {\n assetAddr = registry.resolveToken(chainName, asset).address;\n } catch {\n return [];\n }\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending);\n if (protos.length === 0) return [];\n const rpc = chain.effectiveRpcUrl();\n const rates: ScanRate[] = [];\n for (const proto of protos) {\n try {\n const lending = createLending(proto, rpc);\n const r = await lending.getRates(assetAddr);\n if (r.supply_apy > 0) {\n rates.push({\n chain: chain.name,\n protocol: r.protocol,\n slug: proto.slug,\n supply_apy: r.supply_apy,\n borrow_variable_apy: r.borrow_variable_apy,\n });\n }\n } catch {\n // skip unreachable\n }\n }\n return rates;\n } catch {\n return [];\n }\n });\n\n const nested = await Promise.all(tasks);\n const all = nested.flat();\n all.sort((a, b) => b.supply_apy - a.supply_apy);\n return all;\n}\n\nexport function registerYield(parent: Command, getOpts: () => OutputMode, makeExecutor: () => Executor): void {\n const yieldCmd = parent\n .command(\"yield\")\n .description(\"Yield operations: compare, scan, optimize, execute\");\n\n // yield (no subcommand) = scan with default USDC; --chain filters to single chain\n yieldCmd\n .option(\"--asset <token>\", \"Token symbol or address\", \"USDC\")\n .action(async (opts) => {\n try {\n const registry = Registry.loadEmbedded();\n const asset = opts.asset as string;\n const specifiedChain = parent.opts<{ chain?: string }>().chain;\n const chainKeys = specifiedChain\n ? [specifiedChain.toLowerCase()]\n : Array.from(registry.chains.keys());\n const allRates: Array<{ chain: string; protocol: string; supply_apy: number; borrow_variable_apy: number }> = [];\n\n for (const chainKey of chainKeys) {\n try {\n const chain = registry.getChain(chainKey);\n const rpc = chain.effectiveRpcUrl();\n let assetAddr: Address;\n try {\n assetAddr = resolveAsset(registry, chainKey, asset);\n } catch { continue; }\n const rates = await collectLendingRates(registry, chainKey, rpc, assetAddr);\n for (const r of rates) {\n if (r.supply_apy > 0) {\n allRates.push({ chain: chain.name, protocol: r.protocol, supply_apy: r.supply_apy, borrow_variable_apy: r.borrow_variable_apy });\n }\n }\n } catch { /* skip chain */ }\n }\n\n allRates.sort((a, b) => b.supply_apy - a.supply_apy);\n const best = allRates[0] ? `${allRates[0].protocol} on ${allRates[0].chain}` : null;\n printOutput({ asset, chains_scanned: registry.chains.size, rates: allRates, best_supply: best }, getOpts());\n } catch (err) {\n printOutput({ error: String(err) }, getOpts());\n }\n });\n\n // yield compare\n yieldCmd\n .command(\"compare\")\n .description(\"Compare lending rates across protocols for an asset\")\n .option(\"--asset <token>\", \"Token symbol or address\", \"USDC\")\n .action(async (opts) => {\n try {\n const registry = Registry.loadEmbedded();\n const specChain = parent.opts<{ chain?: string }>().chain;\n if (!specChain) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const chainName: string = specChain.toLowerCase();\n const chain = registry.getChain(chainName);\n const rpc = chain.effectiveRpcUrl();\n const assetAddr = resolveAsset(registry, chainName, opts.asset as string);\n\n const results = await collectLendingRates(registry, chainName, rpc, assetAddr);\n\n if (results.length === 0) {\n printOutput(\n { error: `No lending rate data available for asset '${opts.asset}'` },\n getOpts(),\n );\n process.exit(1);\n return;\n }\n\n results.sort((a, b) => b.supply_apy - a.supply_apy);\n\n const bestSupply = results[0]?.protocol ?? null;\n const bestBorrow =\n results.reduce((best, r) => {\n if (!best || r.borrow_variable_apy < best.borrow_variable_apy) return r;\n return best;\n }, null as LendingRates | null)?.protocol ?? null;\n\n printOutput(\n {\n asset: opts.asset,\n rates: results,\n best_supply: bestSupply,\n best_borrow: bestBorrow,\n },\n getOpts(),\n );\n } catch (err) {\n printOutput({ error: String(err) }, getOpts());\n process.exit(1);\n }\n });\n\n // yield scan\n yieldCmd\n .command(\"scan\")\n .description(\"Scan all chains for best yield opportunities (parallel)\")\n .option(\"--asset <token>\", \"Token symbol (e.g. USDC, WETH)\", \"USDC\")\n .action(async (opts) => {\n try {\n const registry = Registry.loadEmbedded();\n await runYieldScan(registry, (opts.asset ?? \"USDC\") as string, getOpts());\n } catch (err) {\n printOutput({ error: String(err) }, getOpts());\n process.exit(1);\n }\n });\n\n // yield execute\n yieldCmd\n .command(\"execute\")\n .description(\"Find the best yield opportunity and execute supply (or show cross-chain plan)\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address (e.g. USDC)\")\n .requiredOption(\"--amount <amount>\", \"Human-readable amount to supply (e.g. 1000)\")\n .option(\"--min-spread <percent>\", \"Minimum spread % required to execute cross-chain arb\", \"1.0\")\n .option(\"--target-chain <chain>\", \"Override auto-detected best chain\")\n .option(\"--target-protocol <protocol>\", \"Override auto-detected best protocol slug\")\n .action(async (opts) => {\n try {\n const registry = Registry.loadEmbedded();\n const asset = opts.asset as string;\n const humanAmount = parseFloat(opts.amount as string);\n if (isNaN(humanAmount) || humanAmount <= 0) {\n printOutput({ error: `Invalid amount: ${opts.amount}` }, getOpts());\n process.exit(1);\n return;\n }\n const minSpread = parseFloat((opts.minSpread as string) ?? \"1.0\");\n\n let targetChainName: string;\n let targetProtocolSlug: string | undefined = opts.targetProtocol as string | undefined;\n\n if (opts.targetChain) {\n // Manual chain override — skip scan\n targetChainName = (opts.targetChain as string).toLowerCase();\n } else {\n // Run cross-chain scan to find best supply opportunity\n process.stderr.write(`Scanning all chains for best ${asset} yield...\\n`);\n const t0 = Date.now();\n const allRates = await scanRatesForExecute(registry, asset);\n process.stderr.write(`Scan done in ${Date.now() - t0}ms — ${allRates.length} rates found\\n`);\n\n if (allRates.length === 0) {\n printOutput({ error: `No yield opportunities found for ${asset}` }, getOpts());\n process.exit(1);\n return;\n }\n\n // Find best cross-chain arb (highest spread)\n let bestArb: {\n spread_pct: number;\n supply_chain: string;\n supply_protocol: string;\n supply_slug: string;\n supply_apy: number;\n borrow_chain: string;\n borrow_protocol: string;\n borrow_apy: number;\n strategy: string;\n } | null = null;\n\n for (const s of allRates) {\n for (const b of allRates) {\n const spread = s.supply_apy - b.borrow_variable_apy;\n if (spread > 0 && b.borrow_variable_apy > 0 && (s.chain !== b.chain || s.slug !== b.slug)) {\n if (!bestArb || spread > bestArb.spread_pct) {\n bestArb = {\n spread_pct: Math.round(spread * 10000) / 10000,\n supply_chain: s.chain,\n supply_protocol: s.protocol,\n supply_slug: s.slug,\n supply_apy: s.supply_apy,\n borrow_chain: b.chain,\n borrow_protocol: b.protocol,\n borrow_apy: b.borrow_variable_apy,\n strategy: s.chain === b.chain ? \"same-chain\" : \"cross-chain\",\n };\n }\n }\n }\n }\n\n // If best arb is cross-chain and meets min-spread: output plan only (no execution)\n if (bestArb && bestArb.strategy === \"cross-chain\" && bestArb.spread_pct >= minSpread) {\n const supplyChainLower = bestArb.supply_chain.toLowerCase();\n let supplyAssetAddr: Address | undefined;\n let supplyDecimals = 18;\n try {\n const tok = registry.resolveToken(supplyChainLower, asset);\n supplyAssetAddr = tok.address;\n supplyDecimals = tok.decimals;\n } catch {\n // leave as undefined\n }\n const amountWei = BigInt(Math.round(humanAmount * 10 ** supplyDecimals));\n\n printOutput(\n {\n mode: \"plan_only\",\n reason: \"cross-chain arb requires manual bridge execution\",\n asset,\n amount_human: humanAmount,\n amount_wei: amountWei.toString(),\n best_arb: bestArb,\n steps: [\n {\n step: 1,\n action: \"bridge\",\n description: `Bridge ${humanAmount} ${asset} from current chain to ${bestArb.supply_chain}`,\n from_chain: \"current\",\n to_chain: bestArb.supply_chain,\n token: asset,\n amount_wei: amountWei.toString(),\n },\n {\n step: 2,\n action: \"supply\",\n description: `Supply ${humanAmount} ${asset} on ${bestArb.supply_protocol}`,\n chain: bestArb.supply_chain,\n protocol: bestArb.supply_protocol,\n protocol_slug: bestArb.supply_slug,\n asset_address: supplyAssetAddr,\n amount_wei: amountWei.toString(),\n expected_apy: bestArb.supply_apy,\n },\n ],\n expected_spread_pct: bestArb.spread_pct,\n supply_apy: bestArb.supply_apy,\n borrow_apy: bestArb.borrow_apy,\n },\n getOpts(),\n );\n return;\n }\n\n // Fall through to same-chain supply on the best rate\n targetChainName = allRates[0].chain.toLowerCase();\n if (!targetProtocolSlug) {\n targetProtocolSlug = allRates[0].slug;\n }\n }\n\n // Same-chain supply execution path\n const chain = registry.getChain(targetChainName);\n const chainName = chain.name.toLowerCase();\n const rpc = chain.effectiveRpcUrl();\n\n // Resolve asset address + decimals on target chain\n let assetAddr: Address;\n let decimals = 18;\n try {\n const tok = registry.resolveToken(chainName, asset);\n assetAddr = tok.address;\n decimals = tok.decimals;\n } catch {\n if (/^0x[0-9a-fA-F]{40}$/.test(asset)) {\n assetAddr = asset as Address;\n } else {\n printOutput({ error: `Cannot resolve ${asset} on chain ${chainName}` }, getOpts());\n process.exit(1);\n return;\n }\n }\n\n const amountWei = BigInt(Math.round(humanAmount * 10 ** decimals));\n\n // Resolve protocol\n let proto: ReturnType<typeof registry.getProtocol>;\n if (targetProtocolSlug) {\n try {\n proto = registry.getProtocol(targetProtocolSlug);\n } catch {\n printOutput({ error: `Protocol not found: ${targetProtocolSlug}` }, getOpts());\n process.exit(1);\n return;\n }\n } else {\n // Pick the aave_v3 protocol on the target chain with highest supply APY\n const candidates = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending);\n if (candidates.length === 0) {\n printOutput({ error: `No aave_v3 lending protocol found on ${chainName}` }, getOpts());\n process.exit(1);\n return;\n }\n let bestRate: LendingRates | null = null;\n let bestProto = candidates[0];\n for (const c of candidates) {\n try {\n const lending = createLending(c, rpc);\n const r = await lending.getRates(assetAddr);\n if (!bestRate || r.supply_apy > bestRate.supply_apy) {\n bestRate = r;\n bestProto = c;\n }\n } catch {\n // skip\n }\n }\n proto = bestProto;\n }\n\n const onBehalfOf = (\n process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\"\n ) as Address;\n const adapter = createLending(proto, rpc);\n\n // Fetch current rate for display (non-fatal)\n let currentApy: number | undefined;\n try {\n const r = await adapter.getRates(assetAddr);\n currentApy = r.supply_apy;\n } catch {\n // non-fatal\n }\n\n process.stderr.write(\n `Supplying ${humanAmount} ${asset} (${amountWei} wei) on ${proto.name} (${chain.name})...\\n`,\n );\n\n const executor = makeExecutor();\n const tx = await adapter.buildSupply({\n protocol: proto.name,\n asset: assetAddr,\n amount: amountWei,\n on_behalf_of: onBehalfOf,\n });\n\n const result = await executor.execute(tx);\n\n printOutput(\n {\n action: \"yield_execute\",\n asset,\n amount_human: humanAmount,\n amount_wei: amountWei.toString(),\n chain: chain.name,\n protocol: proto.name,\n protocol_slug: proto.slug,\n supply_apy: currentApy,\n result,\n },\n getOpts(),\n );\n } catch (err) {\n printOutput({ error: String(err) }, getOpts());\n process.exit(1);\n }\n });\n\n // yield optimize\n yieldCmd\n .command(\"optimize\")\n .description(\"Find the optimal yield strategy for an asset\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .option(\"--strategy <strategy>\", \"Strategy: best-supply, leverage-loop, auto\", \"auto\")\n .option(\"--amount <amount>\", \"Amount to deploy (for allocation breakdown)\")\n .action(async (opts) => {\n try {\n const registry = Registry.loadEmbedded();\n const specChain = parent.opts<{ chain?: string }>().chain;\n if (!specChain) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const chainName: string = specChain.toLowerCase();\n const chain = registry.getChain(chainName);\n const rpc = chain.effectiveRpcUrl();\n const asset = opts.asset as string;\n const assetAddr = resolveAsset(registry, chainName, asset);\n const strategy = (opts.strategy as string) ?? \"auto\";\n\n if (strategy === \"auto\") {\n const opportunities = await collectAllYields(registry, chainName, rpc, asset, assetAddr);\n\n if (opportunities.length === 0) {\n printOutput({ error: `No yield opportunities found for '${asset}'` }, getOpts());\n process.exit(1);\n return;\n }\n\n const amount = opts.amount ? parseFloat(opts.amount as string) : null;\n const weights = [0.6, 0.3, 0.1];\n const allocations =\n amount !== null\n ? opportunities.slice(0, weights.length).map((opp, i) => ({\n protocol: (opp as Record<string, unknown>)[\"protocol\"],\n type: (opp as Record<string, unknown>)[\"type\"],\n apy: (opp as Record<string, unknown>)[\"apy\"],\n allocation_pct: weights[i] * 100,\n amount: (amount * weights[i]).toFixed(2),\n }))\n : [];\n\n const best = opportunities[0] as Record<string, unknown>;\n const weightedApy =\n allocations.length > 0\n ? opportunities.slice(0, weights.length).reduce((sum: number, o, i) => {\n return sum + ((o as Record<string, unknown>)[\"apy\"] as number ?? 0) * weights[i];\n }, 0)\n : (best[\"apy\"] as number ?? 0);\n\n printOutput(\n {\n strategy: \"auto\",\n asset,\n best_protocol: best[\"protocol\"],\n best_apy: best[\"apy\"],\n weighted_apy: weightedApy,\n opportunities,\n allocation: allocations,\n },\n getOpts(),\n );\n } else if (strategy === \"best-supply\") {\n const results = await collectLendingRates(registry, chainName, rpc, assetAddr);\n\n if (results.length === 0) {\n printOutput({ error: `No lending rate data available for asset '${asset}'` }, getOpts());\n process.exit(1);\n return;\n }\n\n results.sort((a, b) => b.supply_apy - a.supply_apy);\n const best = results[0];\n const recommendations = results.map((r) => ({\n protocol: r.protocol,\n supply_apy: r.supply_apy,\n action: \"supply\",\n }));\n\n printOutput(\n {\n strategy: \"best-supply\",\n asset,\n recommendation: `Supply ${asset} on ${best.protocol} for ${(best.supply_apy * 100).toFixed(2)}% APY`,\n best_protocol: best.protocol,\n best_supply_apy: best.supply_apy,\n all_options: recommendations,\n },\n getOpts(),\n );\n } else if (strategy === \"leverage-loop\") {\n const results = await collectLendingRates(registry, chainName, rpc, assetAddr);\n\n if (results.length === 0) {\n printOutput({ error: `No lending rate data available for asset '${asset}'` }, getOpts());\n process.exit(1);\n return;\n }\n\n const ltv = 0.8;\n const loops = 5;\n const candidates: unknown[] = [];\n\n for (const r of results) {\n const threshold = r.borrow_variable_apy * 0.8;\n if (r.supply_apy > threshold && r.borrow_variable_apy > 0) {\n let effectiveSupplyApy = 0;\n let effectiveBorrowApy = 0;\n let leverage = 1.0;\n for (let l = 0; l < loops; l++) {\n effectiveSupplyApy += r.supply_apy * leverage;\n effectiveBorrowApy += r.borrow_variable_apy * leverage * ltv;\n leverage *= ltv;\n }\n candidates.push({\n protocol: r.protocol,\n supply_apy: r.supply_apy,\n borrow_variable_apy: r.borrow_variable_apy,\n loops,\n ltv,\n effective_supply_apy: effectiveSupplyApy,\n effective_borrow_cost: effectiveBorrowApy,\n net_apy: effectiveSupplyApy - effectiveBorrowApy,\n });\n }\n }\n\n candidates.sort((a, b) => {\n const an = (a as Record<string, unknown>)[\"net_apy\"] as number ?? 0;\n const bn = (b as Record<string, unknown>)[\"net_apy\"] as number ?? 0;\n return bn - an;\n });\n\n const recommendation =\n candidates.length > 0\n ? (() => {\n const b = candidates[0] as Record<string, unknown>;\n return `Leverage loop ${asset} on ${b[\"protocol\"]} — net APY: ${((b[\"net_apy\"] as number) * 100).toFixed(2)}% (${loops} loops at ${ltv * 100}% LTV)`;\n })()\n : `No favorable leverage loop found for ${asset} — supply rate too low relative to borrow rate`;\n\n printOutput(\n {\n strategy: \"leverage-loop\",\n asset,\n recommendation,\n candidates,\n },\n getOpts(),\n );\n } else {\n printOutput(\n { error: `Unknown strategy '${strategy}'. Supported: best-supply, leverage-loop, auto` },\n getOpts(),\n );\n process.exit(1);\n }\n } catch (err) {\n printOutput({ error: String(err) }, getOpts());\n process.exit(1);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseAbi } from \"viem\";\nimport { Registry, ProtocolCategory, multicallRead } from \"@hypurrquant/defi-core\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { takeSnapshot, saveSnapshot, loadSnapshots, calculatePnL } from \"../portfolio-tracker.js\";\nimport { requireChain, errMsg } from \"../utils.js\";\n\nconst ERC20_ABI = parseAbi([\n \"function balanceOf(address owner) external view returns (uint256)\",\n]);\n\nconst POOL_ABI = parseAbi([\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n]);\n\nfunction decodeU256(data: Hex | null, wordOffset = 0): bigint {\n if (!data || data.length < 2 + (wordOffset + 1) * 64) return 0n;\n const hex = data.slice(2 + wordOffset * 64, 2 + wordOffset * 64 + 64);\n return BigInt(\"0x\" + hex);\n}\n\nexport function registerPortfolio(parent: Command, getOpts: () => OutputMode): void {\n const portfolio = parent\n .command(\"portfolio\")\n .description(\"Aggregate positions across all protocols\");\n\n // Show current positions\n portfolio\n .command(\"show\")\n .description(\"Show current portfolio positions\")\n .requiredOption(\"--address <address>\", \"Wallet address to query\")\n .action(async (opts: { address: string }) => {\n\n const mode = getOpts();\n const registry = Registry.loadEmbedded();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n\n let chain;\n try {\n chain = registry.getChain(chainName);\n } catch (e) {\n printOutput({ error: `Chain not found: ${chainName}` }, mode);\n return;\n }\n\n const user = opts.address as Address;\n if (!/^0x[0-9a-fA-F]{40}$/.test(user)) {\n printOutput({ error: `Invalid address: ${opts.address}` }, mode);\n return;\n }\n\n const rpc = chain.effectiveRpcUrl();\n const calls: Array<[Address, Hex]> = [];\n const callLabels: string[] = [];\n\n // 1. Token balances\n const tokenSymbols: string[] = (registry.tokens.get(chainName) ?? []).map((t) => t.symbol);\n\n for (const symbol of tokenSymbols) {\n let entry;\n try {\n entry = registry.resolveToken(chainName, symbol);\n } catch {\n continue;\n }\n if (entry.address === (\"0x0000000000000000000000000000000000000000\" as Address)) continue;\n calls.push([\n entry.address as Address,\n encodeFunctionData({ abi: ERC20_ABI, functionName: \"balanceOf\", args: [user] }),\n ]);\n callLabels.push(`balance:${symbol}`);\n }\n\n // 2. Lending positions — aave_v3 pools\n const lendingProtocols = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending && p.interface === \"aave_v3\")\n .filter((p) => p.contracts?.[\"pool\"]);\n\n for (const p of lendingProtocols) {\n calls.push([\n p.contracts![\"pool\"] as Address,\n encodeFunctionData({ abi: POOL_ABI, functionName: \"getUserAccountData\", args: [user] }),\n ]);\n callLabels.push(`lending:${p.name}`);\n }\n\n // 3. Native token price from first available oracle\n const oracleEntry = registry\n .getProtocolsForChain(chainName)\n .find((p) => p.interface === \"aave_v3\" && p.contracts?.[\"oracle\"]);\n const oracleAddr = oracleEntry?.contracts?.[\"oracle\"] as Address | undefined;\n const wrappedNative = (chain.wrapped_native ?? \"0x5555555555555555555555555555555555555555\") as Address;\n\n if (oracleAddr) {\n calls.push([\n oracleAddr,\n encodeFunctionData({ abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [wrappedNative] }),\n ]);\n callLabels.push(\"price:native\");\n }\n\n if (calls.length === 0) {\n printOutput(\n {\n address: user,\n chain: chain.name,\n error: \"No protocols or tokens configured for this chain\",\n },\n mode,\n );\n return;\n }\n\n let results: (Hex | null)[];\n try {\n results = await multicallRead(rpc, calls);\n } catch (e) {\n printOutput({ error: `Multicall failed: ${errMsg(e)}` }, mode);\n return;\n }\n\n // Get native price (last call if oracle present)\n let nativePriceUsd = 0;\n if (oracleAddr) {\n const priceData = results[results.length - 1] ?? null;\n nativePriceUsd = Number(decodeU256(priceData)) / 1e8;\n }\n\n let totalValueUsd = 0;\n let idx = 0;\n const tokenBalances: unknown[] = [];\n\n // Parse token balances\n for (const symbol of tokenSymbols) {\n let entry;\n try {\n entry = registry.resolveToken(chainName, symbol);\n } catch {\n continue;\n }\n if (entry.address === (\"0x0000000000000000000000000000000000000000\" as Address)) continue;\n if (idx >= results.length) break;\n\n const balance = decodeU256(results[idx] ?? null);\n if (balance > 0n) {\n const decimals = entry.decimals;\n const balF64 = Number(balance) / 10 ** decimals;\n const symbolUpper = symbol.toUpperCase();\n const valueUsd =\n symbolUpper.includes(\"USD\") || symbolUpper.includes(\"usd\")\n ? balF64\n : balF64 * nativePriceUsd;\n totalValueUsd += valueUsd;\n tokenBalances.push({\n symbol,\n balance: balF64.toFixed(4),\n value_usd: valueUsd.toFixed(2),\n });\n }\n idx++;\n }\n\n // Parse lending positions\n const lendingPositions: unknown[] = [];\n for (const p of lendingProtocols) {\n if (idx >= results.length) break;\n const data = results[idx] ?? null;\n if (data && data.length >= 2 + 192 * 2) {\n const collateral = Number(decodeU256(data, 0)) / 1e8;\n const debt = Number(decodeU256(data, 1)) / 1e8;\n const hfRaw = decodeU256(data, 5);\n let hf: number | null = null;\n if (hfRaw <= BigInt(\"0xffffffffffffffffffffffffffffffff\")) {\n const v = Number(hfRaw) / 1e18;\n hf = v > 1e10 ? null : v;\n }\n if (collateral > 0 || debt > 0) {\n totalValueUsd += collateral - debt;\n lendingPositions.push({\n protocol: p.name,\n collateral_usd: collateral.toFixed(2),\n debt_usd: debt.toFixed(2),\n health_factor: hf,\n });\n }\n }\n idx++;\n }\n\n printOutput(\n {\n address: user,\n chain: chain.name,\n native_price_usd: nativePriceUsd.toFixed(2),\n total_value_usd: totalValueUsd.toFixed(2),\n token_balances: tokenBalances,\n lending_positions: lendingPositions,\n },\n mode,\n );\n });\n\n // --- Subcommand: snapshot ---\n portfolio\n .command(\"snapshot\")\n .description(\"Take a new portfolio snapshot and save it locally\")\n .requiredOption(\"--address <address>\", \"Wallet address to snapshot\")\n .action(async (opts: { address: string }) => {\n const mode = getOpts();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n\n if (!/^0x[0-9a-fA-F]{40}$/.test(opts.address)) {\n printOutput({ error: `Invalid address: ${opts.address}` }, mode);\n return;\n }\n\n try {\n const snapshot = await takeSnapshot(chainName, opts.address, registry);\n const filepath = saveSnapshot(snapshot);\n printOutput(\n {\n saved: filepath,\n timestamp: new Date(snapshot.timestamp).toISOString(),\n chain: snapshot.chain,\n wallet: snapshot.wallet,\n total_value_usd: snapshot.total_value_usd.toFixed(2),\n token_count: snapshot.tokens.length,\n defi_position_count: snapshot.defi_positions.length,\n },\n mode,\n );\n } catch (e) {\n printOutput({ error: errMsg(e) }, mode);\n }\n });\n\n // --- Subcommand: pnl ---\n portfolio\n .command(\"pnl\")\n .description(\"Show PnL since the last snapshot\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--since <hours>\", \"Compare against snapshot from N hours ago (default: last snapshot)\")\n .action(async (opts: { address: string; since?: string }) => {\n const mode = getOpts();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n\n if (!/^0x[0-9a-fA-F]{40}$/.test(opts.address)) {\n printOutput({ error: `Invalid address: ${opts.address}` }, mode);\n return;\n }\n\n const snapshots = loadSnapshots(chainName, opts.address, 50);\n if (snapshots.length === 0) {\n printOutput({ error: \"No snapshots found. Run `portfolio snapshot` first.\" }, mode);\n return;\n }\n\n let previous = snapshots[0];\n if (opts.since) {\n const sinceMs = parseFloat(opts.since) * 60 * 60 * 1000;\n const cutoff = Date.now() - sinceMs;\n const match = snapshots.find((s) => s.timestamp <= cutoff);\n if (!match) {\n printOutput({ error: `No snapshot found older than ${opts.since} hours` }, mode);\n return;\n }\n previous = match;\n }\n\n try {\n const current = await takeSnapshot(chainName, opts.address, registry);\n const pnl = calculatePnL(current, previous);\n printOutput(\n {\n chain: chainName,\n wallet: opts.address,\n previous_snapshot: new Date(previous.timestamp).toISOString(),\n current_time: new Date(current.timestamp).toISOString(),\n ...pnl,\n pnl_usd: pnl.pnl_usd.toFixed(2),\n pnl_pct: pnl.pnl_pct.toFixed(4),\n start_value_usd: pnl.start_value_usd.toFixed(2),\n end_value_usd: pnl.end_value_usd.toFixed(2),\n },\n mode,\n );\n } catch (e) {\n printOutput({ error: errMsg(e) }, mode);\n }\n });\n\n // --- Subcommand: history ---\n portfolio\n .command(\"history\")\n .description(\"List saved portfolio snapshots with values\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--limit <n>\", \"Number of snapshots to show\", \"10\")\n .action(async (opts: { address: string; limit: string }) => {\n const mode = getOpts();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n\n if (!/^0x[0-9a-fA-F]{40}$/.test(opts.address)) {\n printOutput({ error: `Invalid address: ${opts.address}` }, mode);\n return;\n }\n\n const limit = parseInt(opts.limit, 10);\n const snapshots = loadSnapshots(chainName, opts.address, limit);\n\n if (snapshots.length === 0) {\n printOutput({ message: \"No snapshots found for this address on this chain.\" }, mode);\n return;\n }\n\n const history = snapshots.map((s) => ({\n timestamp: new Date(s.timestamp).toISOString(),\n chain: s.chain,\n wallet: s.wallet,\n total_value_usd: s.total_value_usd.toFixed(2),\n token_count: s.tokens.length,\n defi_position_count: s.defi_positions.length,\n }));\n\n printOutput({ snapshots: history }, mode);\n });\n}\n","import { mkdirSync, writeFileSync, readdirSync, readFileSync, existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { resolve } from \"path\";\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseAbi } from \"viem\";\nimport { Registry, ProtocolCategory, multicallRead } from \"@hypurrquant/defi-core\";\nimport type { PortfolioSnapshot, TokenBalance, DefiPosition, PortfolioPnL, TokenChange } from \"@hypurrquant/defi-core\";\n\nconst ERC20_ABI = parseAbi([\n \"function balanceOf(address owner) external view returns (uint256)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n]);\n\nconst POOL_ABI = parseAbi([\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n]);\n\nfunction decodeU256Word(data: Hex | null, wordOffset = 0): bigint {\n if (!data || data.length < 2 + (wordOffset + 1) * 64) return 0n;\n const hex = data.slice(2 + wordOffset * 64, 2 + wordOffset * 64 + 64);\n return BigInt(\"0x\" + hex);\n}\n\nfunction snapshotDir(): string {\n return resolve(homedir(), \".defi-cli\", \"snapshots\");\n}\n\nexport async function takeSnapshot(\n chainName: string,\n wallet: string,\n registry: Registry,\n): Promise<PortfolioSnapshot> {\n const chain = registry.getChain(chainName);\n const user = wallet as Address;\n const rpc = chain.effectiveRpcUrl();\n\n const calls: Array<[Address, Hex]> = [];\n const callLabels: string[] = [];\n\n // 1. Token balances\n const tokenEntries: Array<{ symbol: string; address: Address; decimals: number }> = [];\n for (const t of registry.tokens.get(chainName) ?? []) {\n let entry;\n try {\n entry = registry.resolveToken(chainName, t.symbol);\n } catch {\n continue;\n }\n if (entry.address === (\"0x0000000000000000000000000000000000000000\" as Address)) continue;\n tokenEntries.push({ symbol: t.symbol, address: entry.address as Address, decimals: entry.decimals });\n calls.push([\n entry.address as Address,\n encodeFunctionData({ abi: ERC20_ABI, functionName: \"balanceOf\", args: [user] }),\n ]);\n callLabels.push(`balance:${t.symbol}`);\n }\n\n // 2. Lending positions (aave_v3)\n const lendingProtocols = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending && p.interface === \"aave_v3\")\n .filter((p) => p.contracts?.[\"pool\"]);\n\n for (const p of lendingProtocols) {\n calls.push([\n p.contracts![\"pool\"] as Address,\n encodeFunctionData({ abi: POOL_ABI, functionName: \"getUserAccountData\", args: [user] }),\n ]);\n callLabels.push(`lending:${p.name}`);\n }\n\n // 3. Native price from oracle\n const oracleEntry = registry\n .getProtocolsForChain(chainName)\n .find((p) => p.interface === \"aave_v3\" && p.contracts?.[\"oracle\"]);\n const oracleAddr = oracleEntry?.contracts?.[\"oracle\"] as Address | undefined;\n const wrappedNative = (chain.wrapped_native ?? \"0x5555555555555555555555555555555555555555\") as Address;\n\n if (oracleAddr) {\n calls.push([\n oracleAddr,\n encodeFunctionData({ abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [wrappedNative] }),\n ]);\n callLabels.push(\"price:native\");\n }\n\n let results: (Hex | null)[] = calls.map(() => null);\n if (calls.length > 0) {\n results = await multicallRead(rpc, calls);\n }\n\n // Native price\n let nativePriceUsd = 0;\n if (oracleAddr) {\n const priceData = results[results.length - 1] ?? null;\n nativePriceUsd = Number(decodeU256Word(priceData)) / 1e8;\n }\n\n let idx = 0;\n const tokens: TokenBalance[] = [];\n let totalValueUsd = 0;\n\n // Parse token balances\n for (const entry of tokenEntries) {\n if (idx >= results.length) break;\n const balance = decodeU256Word(results[idx] ?? null);\n const balF64 = Number(balance) / 10 ** entry.decimals;\n const symbolUpper = entry.symbol.toUpperCase();\n const priceUsd =\n symbolUpper.includes(\"USD\") ? 1 : nativePriceUsd;\n const valueUsd = balF64 * priceUsd;\n totalValueUsd += valueUsd;\n tokens.push({\n token: entry.address,\n symbol: entry.symbol,\n balance,\n value_usd: valueUsd,\n price_usd: priceUsd,\n });\n idx++;\n }\n\n // Parse lending positions\n const defiPositions: DefiPosition[] = [];\n for (const p of lendingProtocols) {\n if (idx >= results.length) break;\n const data = results[idx] ?? null;\n if (data && data.length >= 2 + 192 * 2) {\n const collateral = Number(decodeU256Word(data, 0)) / 1e8;\n const debt = Number(decodeU256Word(data, 1)) / 1e8;\n if (collateral > 0) {\n totalValueUsd += collateral;\n defiPositions.push({\n protocol: p.name,\n type: \"lending_supply\",\n asset: \"collateral\",\n amount: BigInt(Math.round(collateral * 1e8)),\n value_usd: collateral,\n });\n }\n if (debt > 0) {\n totalValueUsd -= debt;\n defiPositions.push({\n protocol: p.name,\n type: \"lending_borrow\",\n asset: \"debt\",\n amount: BigInt(Math.round(debt * 1e8)),\n value_usd: debt,\n });\n }\n }\n idx++;\n }\n\n return {\n timestamp: Date.now(),\n chain: chainName,\n wallet,\n tokens,\n defi_positions: defiPositions,\n total_value_usd: totalValueUsd,\n };\n}\n\nexport function saveSnapshot(snapshot: PortfolioSnapshot): string {\n const dir = snapshotDir();\n mkdirSync(dir, { recursive: true });\n const filename = `${snapshot.chain}_${snapshot.wallet}_${snapshot.timestamp}.json`;\n const filepath = resolve(dir, filename);\n writeFileSync(filepath, JSON.stringify(snapshot, (_k, v) => (typeof v === \"bigint\" ? v.toString() : v), 2));\n return filepath;\n}\n\nexport function loadSnapshots(chain: string, wallet: string, limit = 10): PortfolioSnapshot[] {\n const dir = snapshotDir();\n if (!existsSync(dir)) return [];\n\n const prefix = `${chain}_${wallet}_`;\n const files = readdirSync(dir)\n .filter((f) => f.startsWith(prefix) && f.endsWith(\".json\"))\n .sort()\n .reverse()\n .slice(0, limit);\n\n return files.map((f) => {\n const raw = JSON.parse(readFileSync(resolve(dir, f), \"utf-8\"));\n // Restore bigint fields\n if (Array.isArray(raw.tokens)) {\n for (const t of raw.tokens) {\n if (typeof t.balance === \"string\") t.balance = BigInt(t.balance);\n }\n }\n if (Array.isArray(raw.defi_positions)) {\n for (const p of raw.defi_positions) {\n if (typeof p.amount === \"string\") p.amount = BigInt(p.amount);\n }\n }\n return raw as PortfolioSnapshot;\n });\n}\n\nexport function calculatePnL(current: PortfolioSnapshot, previous: PortfolioSnapshot): PortfolioPnL {\n const startValue = previous.total_value_usd;\n const endValue = current.total_value_usd;\n const pnlUsd = endValue - startValue;\n const pnlPct = startValue !== 0 ? (pnlUsd / startValue) * 100 : 0;\n\n const prevTokenMap = new Map<string, TokenBalance>();\n for (const t of previous.tokens) {\n prevTokenMap.set(t.symbol, t);\n }\n\n const tokenChanges: TokenChange[] = [];\n for (const t of current.tokens) {\n const prev = prevTokenMap.get(t.symbol);\n const prevBalance = prev?.balance ?? 0n;\n const prevValueUsd = prev?.value_usd ?? 0;\n const balanceChange = t.balance - prevBalance;\n const valueChangeUsd = t.value_usd - prevValueUsd;\n if (balanceChange !== 0n || Math.abs(valueChangeUsd) > 0.001) {\n tokenChanges.push({\n symbol: t.symbol,\n balance_change: balanceChange,\n value_change_usd: valueChangeUsd,\n });\n }\n }\n\n const durationMs = current.timestamp - previous.timestamp;\n const durationHours = durationMs / (1000 * 60 * 60);\n const period =\n durationHours < 1\n ? `${Math.round(durationMs / 60000)}m`\n : durationHours < 24\n ? `${durationHours.toFixed(1)}h`\n : `${(durationHours / 24).toFixed(1)}d`;\n\n return {\n period,\n start_value_usd: startValue,\n end_value_usd: endValue,\n pnl_usd: pnlUsd,\n pnl_pct: pnlPct,\n token_changes: tokenChanges,\n };\n}\n","import type { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { Registry, ProtocolCategory } from \"@hypurrquant/defi-core\";\nimport { createOracleFromLending, createOracleFromCdp, createDex, DexSpotPrice } from \"@hypurrquant/defi-protocols\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { requireChain } from \"../utils.js\";\n\ninterface PriceEntry {\n source: string;\n source_type: string;\n price: number;\n}\n\ninterface PriceReport {\n asset: string;\n asset_address: string;\n prices: PriceEntry[];\n max_spread_pct: number;\n oracle_vs_dex_spread_pct: number;\n}\n\nfunction round2(x: number): number {\n return Math.round(x * 100) / 100;\n}\n\nfunction resolveAsset(\n registry: Registry,\n chain: string,\n asset: string,\n): { address: Address; symbol: string; decimals: number } {\n // Try parse as address\n if (/^0x[0-9a-fA-F]{40}$/.test(asset)) {\n return { address: asset as Address, symbol: asset, decimals: 18 };\n }\n const token = registry.resolveToken(chain, asset);\n return { address: token.address, symbol: token.symbol, decimals: token.decimals };\n}\n\nconst WHYPE_ADDRESS = \"0x5555555555555555555555555555555555555555\" as Address;\n\nexport function registerPrice(parent: Command, getOpts: () => OutputMode): void {\n parent\n .command(\"price\")\n .description(\"Query asset prices from oracles and DEXes\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .option(\"--source <source>\", \"Price source: oracle, dex, or all\", \"all\")\n .action(async (opts: { asset: string; source: string }) => {\n const mode = getOpts();\n const registry = Registry.loadEmbedded();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n\n let chain;\n try {\n chain = registry.getChain(chainName);\n } catch (e) {\n printOutput({ error: `Chain not found: ${chainName}` }, mode);\n return;\n }\n\n const rpcUrl = chain.effectiveRpcUrl();\n\n let assetAddr: Address;\n let assetSymbol: string;\n let assetDecimals: number;\n try {\n const resolved = resolveAsset(registry, chainName, opts.asset);\n assetAddr = resolved.address;\n assetSymbol = resolved.symbol;\n assetDecimals = resolved.decimals;\n } catch (e) {\n printOutput({ error: `Could not resolve asset: ${opts.asset}` }, mode);\n return;\n }\n\n const fetchOracle = opts.source === \"all\" || opts.source === \"oracle\";\n const fetchDex = opts.source === \"all\" || opts.source === \"dex\";\n\n const allPrices: Array<{ source: string; source_type: string; price_f64: number }> = [];\n\n // Oracle prices from lending protocols (Aave V3 forks)\n if (fetchOracle) {\n const lendingProtocols = registry.getProtocolsByCategory(ProtocolCategory.Lending)\n .filter((p) => p.chain.toLowerCase() === chainName);\n\n await Promise.all(\n lendingProtocols.map(async (entry) => {\n try {\n const oracle = createOracleFromLending(entry, rpcUrl);\n const price = await oracle.getPrice(assetAddr);\n allPrices.push({\n source: price.source,\n source_type: price.source_type,\n price_f64: price.price_f64,\n });\n } catch {\n // Interface doesn't support oracle — skip\n }\n }),\n );\n\n // Oracle prices from CDP protocols (Felix) — only for WHYPE\n const isWhype =\n assetAddr.toLowerCase() === WHYPE_ADDRESS.toLowerCase() ||\n assetSymbol.toUpperCase() === \"WHYPE\" ||\n assetSymbol.toUpperCase() === \"HYPE\";\n\n if (isWhype) {\n const cdpProtocols = registry.getProtocolsByCategory(ProtocolCategory.Cdp)\n .filter((p) => p.chain.toLowerCase() === chainName);\n\n await Promise.all(\n cdpProtocols.map(async (entry) => {\n try {\n const oracle = createOracleFromCdp(entry, assetAddr, rpcUrl);\n const price = await oracle.getPrice(assetAddr);\n allPrices.push({\n source: price.source,\n source_type: price.source_type,\n price_f64: price.price_f64,\n });\n } catch {\n // skip\n }\n }),\n );\n }\n }\n\n // DEX spot prices\n if (fetchDex) {\n let usdcToken;\n try {\n usdcToken = registry.resolveToken(chainName, \"USDC\");\n } catch {\n process.stderr.write(\"USDC token not found in registry — skipping DEX prices\\n\");\n }\n\n if (usdcToken) {\n const dexProtocols = registry.getProtocolsByCategory(ProtocolCategory.Dex)\n .filter((p) => p.chain.toLowerCase() === chainName);\n\n await Promise.all(\n dexProtocols.map(async (entry) => {\n try {\n const dex = createDex(entry, rpcUrl);\n const price = await DexSpotPrice.getPrice(\n dex,\n assetAddr,\n assetDecimals,\n usdcToken!.address,\n usdcToken!.decimals,\n );\n allPrices.push({\n source: price.source,\n source_type: price.source_type,\n price_f64: price.price_f64,\n });\n } catch {\n // skip\n }\n }),\n );\n }\n }\n\n if (allPrices.length === 0) {\n printOutput({ error: \"No prices could be fetched from any source\" }, mode);\n return;\n }\n\n const pricesF64 = allPrices.map((p) => p.price_f64);\n const maxPrice = Math.max(...pricesF64);\n const minPrice = Math.min(...pricesF64);\n const maxSpreadPct = minPrice > 0 ? ((maxPrice - minPrice) / minPrice) * 100 : 0;\n\n const oraclePrices = allPrices.filter((p) => p.source_type === \"oracle\").map((p) => p.price_f64);\n const dexPrices = allPrices.filter((p) => p.source_type === \"dex_spot\").map((p) => p.price_f64);\n\n let oracleVsDexSpreadPct = 0;\n if (oraclePrices.length > 0 && dexPrices.length > 0) {\n const avgOracle = oraclePrices.reduce((a, b) => a + b, 0) / oraclePrices.length;\n const avgDex = dexPrices.reduce((a, b) => a + b, 0) / dexPrices.length;\n const minAvg = Math.min(avgOracle, avgDex);\n oracleVsDexSpreadPct = minAvg > 0 ? (Math.abs(avgOracle - avgDex) / minAvg) * 100 : 0;\n }\n\n const report: PriceReport = {\n asset: assetSymbol,\n asset_address: assetAddr,\n prices: allPrices.map((p) => ({\n source: p.source,\n source_type: p.source_type,\n price: round2(p.price_f64),\n })),\n max_spread_pct: round2(maxSpreadPct),\n oracle_vs_dex_spread_pct: round2(oracleVsDexSpreadPct),\n };\n\n printOutput(report, mode);\n });\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport { createPublicClient, http, formatEther } from \"viem\";\nimport { requireChain } from \"../utils.js\";\n\nexport function registerWallet(parent: Command, getOpts: () => OutputMode): void {\n const wallet = parent.command(\"wallet\").description(\"Wallet management\");\n\n wallet\n .command(\"balance\")\n .description(\"Show native token balance\")\n .requiredOption(\"--address <address>\", \"Wallet address to query\")\n .action(async (opts) => {\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const client = createPublicClient({ transport: http(chain.effectiveRpcUrl()) });\n\n const balance = await client.getBalance({ address: opts.address as `0x${string}` });\n printOutput({\n chain: chain.name,\n address: opts.address,\n native_token: chain.native_token,\n balance_wei: balance,\n balance_formatted: formatEther(balance),\n }, getOpts());\n });\n\n wallet\n .command(\"address\")\n .description(\"Show configured wallet address\")\n .action(async () => {\n const addr = process.env.DEFI_WALLET_ADDRESS ?? \"(not set)\";\n printOutput({ address: addr }, getOpts());\n });\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport type { Executor } from \"../executor.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry, buildApprove, buildTransfer, erc20Abi } from \"@hypurrquant/defi-core\";\nimport { createPublicClient, http, maxUint256 } from \"viem\";\nimport type { Address } from \"viem\";\nimport { requireChain, resolveTokenAddress } from \"../utils.js\";\n\nexport function registerToken(parent: Command, getOpts: () => OutputMode, makeExecutor: () => Executor): void {\n const token = parent.command(\"token\").description(\"Token operations: approve, allowance, transfer, balance\");\n\n token\n .command(\"balance\")\n .description(\"Query token balance for an address\")\n .requiredOption(\"--token <token>\", \"Token symbol or address\")\n .requiredOption(\"--owner <address>\", \"Wallet address to query\")\n .action(async (opts) => {\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const client = createPublicClient({ transport: http(chain.effectiveRpcUrl()) });\n\n const tokenAddr = resolveTokenAddress(registry, chainName, opts.token) as Address;\n\n const [balance, symbol, decimals] = await Promise.all([\n client.readContract({ address: tokenAddr, abi: erc20Abi, functionName: \"balanceOf\", args: [opts.owner as Address] }),\n client.readContract({ address: tokenAddr, abi: erc20Abi, functionName: \"symbol\" }),\n client.readContract({ address: tokenAddr, abi: erc20Abi, functionName: \"decimals\" }),\n ]);\n\n printOutput({\n token: tokenAddr,\n symbol,\n owner: opts.owner,\n balance,\n decimals,\n }, getOpts());\n });\n\n token\n .command(\"approve\")\n .description(\"Approve a spender for a token\")\n .requiredOption(\"--token <token>\", \"Token symbol or address\")\n .requiredOption(\"--spender <address>\", \"Spender address\")\n .option(\"--amount <amount>\", \"Amount to approve (use 'max' for unlimited)\", \"max\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const tokenAddr = resolveTokenAddress(registry, chainName, opts.token) as Address;\n\n const amount = opts.amount === \"max\" ? maxUint256 : BigInt(opts.amount);\n const tx = buildApprove(tokenAddr, opts.spender as Address, amount);\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n\n token\n .command(\"allowance\")\n .description(\"Check token allowance\")\n .requiredOption(\"--token <token>\", \"Token symbol or address\")\n .requiredOption(\"--owner <address>\", \"Owner address\")\n .requiredOption(\"--spender <address>\", \"Spender address\")\n .action(async (opts) => {\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const client = createPublicClient({ transport: http(chain.effectiveRpcUrl()) });\n\n const tokenAddr = resolveTokenAddress(registry, chainName, opts.token) as Address;\n\n const allowance = await client.readContract({\n address: tokenAddr, abi: erc20Abi, functionName: \"allowance\",\n args: [opts.owner as Address, opts.spender as Address],\n });\n\n printOutput({ token: tokenAddr, owner: opts.owner, spender: opts.spender, allowance }, getOpts());\n });\n\n token\n .command(\"transfer\")\n .description(\"Transfer tokens to an address\")\n .requiredOption(\"--token <token>\", \"Token symbol or address\")\n .requiredOption(\"--to <address>\", \"Recipient address\")\n .requiredOption(\"--amount <amount>\", \"Amount to transfer (in wei)\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const tokenAddr = resolveTokenAddress(registry, chainName, opts.token) as Address;\n\n const tx = buildTransfer(tokenAddr, opts.to as Address, BigInt(opts.amount));\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\nimport { requireChain, resolveWallet, errMsg } from \"../utils.js\";\n\nconst LIFI_API = \"https://li.quest/v1\";\nconst DLN_API = \"https://dln.debridge.finance/v1.0/dln/order\";\nconst CCTP_FEE_API = \"https://iris-api.circle.com/v2/burn/USDC/fees\";\n\n// ── deBridge DLN ──\n\nconst DLN_CHAIN_IDS: Record<string, number> = {\n ethereum: 1,\n optimism: 10,\n bnb: 56,\n polygon: 137,\n arbitrum: 42161,\n avalanche: 43114,\n base: 8453,\n linea: 59144,\n zksync: 324,\n};\n\nasync function getDebridgeQuote(\n srcChainId: number,\n dstChainId: number,\n srcToken: string,\n dstToken: string,\n amountRaw: string,\n recipient: string,\n): Promise<{ amountOut: string; estimatedTime: number; raw: unknown }> {\n const params = new URLSearchParams({\n srcChainId: String(srcChainId),\n srcChainTokenIn: srcToken,\n srcChainTokenInAmount: amountRaw,\n dstChainId: String(dstChainId),\n dstChainTokenOut: dstToken,\n prependOperatingExpenses: \"true\",\n });\n\n const res = await fetch(`${DLN_API}/quote?${params}`);\n if (!res.ok) throw new Error(`deBridge quote failed: ${res.status} ${await res.text()}`);\n const data = await res.json() as Record<string, unknown>;\n\n const estimation = data.estimation as Record<string, unknown>;\n const dstOut = estimation?.dstChainTokenOut as Record<string, unknown>;\n const amountOut = String(dstOut?.recommendedAmount ?? dstOut?.amount ?? \"0\");\n const fulfillDelay = Number((data.order as Record<string, unknown>)?.approximateFulfillmentDelay ?? 10);\n\n // Get create-tx data for the transaction\n const createParams = new URLSearchParams({\n srcChainId: String(srcChainId),\n srcChainTokenIn: srcToken,\n srcChainTokenInAmount: amountRaw,\n dstChainId: String(dstChainId),\n dstChainTokenOut: dstToken,\n dstChainTokenOutAmount: amountOut,\n dstChainTokenOutRecipient: recipient,\n srcChainOrderAuthorityAddress: recipient,\n dstChainOrderAuthorityAddress: recipient,\n prependOperatingExpenses: \"true\",\n });\n\n const createRes = await fetch(`${DLN_API}/create-tx?${createParams}`);\n if (!createRes.ok) throw new Error(`deBridge create-tx failed: ${createRes.status} ${await createRes.text()}`);\n const createData = await createRes.json() as Record<string, unknown>;\n\n return {\n amountOut,\n estimatedTime: fulfillDelay,\n raw: createData,\n };\n}\n\n// ── Circle CCTP ──\n\n// CCTP domains per chain (V2)\nconst CCTP_DOMAINS: Record<string, number> = {\n ethereum: 0,\n avalanche: 1,\n optimism: 2,\n arbitrum: 3,\n solana: 5,\n base: 6,\n polygon: 7,\n sui: 8,\n aptos: 9,\n};\n\n// TokenMessenger V2 contract address (same on all EVM chains)\nconst CCTP_TOKEN_MESSENGER_V2 = \"0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d\";\n\n// Native USDC addresses per chain\nconst CCTP_USDC_ADDRESSES: Record<string, string> = {\n ethereum: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n avalanche: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n optimism: \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n arbitrum: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n base: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n polygon: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n};\n\nasync function getCctpFeeEstimate(\n srcDomain: number,\n dstDomain: number,\n amountUsdc: number,\n): Promise<{ fee: number; maxFeeSubunits: bigint }> {\n try {\n const res = await fetch(`${CCTP_FEE_API}/${srcDomain}/${dstDomain}`);\n if (res.ok) {\n const schedules = await res.json() as Array<{\n finalityThreshold: number;\n minimumFee: number;\n forwardFee?: { low: number; med: number; high: number };\n }>;\n // Use standard finality (2000) schedule\n const schedule = schedules.find(s => s.finalityThreshold === 2000) ?? schedules[0];\n if (schedule) {\n const amountSubunits = BigInt(Math.round(amountUsdc * 1e6));\n const bpsRounded = BigInt(Math.round(schedule.minimumFee * 100));\n const protocolFee = (amountSubunits * bpsRounded) / 1_000_000n;\n const protocolFeeBuffered = (protocolFee * 120n) / 100n;\n\n if (schedule.forwardFee) {\n const forwardFeeSubunits = BigInt(schedule.forwardFee.high);\n const totalMaxFee = protocolFeeBuffered + forwardFeeSubunits;\n return { fee: Number(totalMaxFee) / 1e6, maxFeeSubunits: totalMaxFee };\n }\n\n const minFee = protocolFeeBuffered > 0n ? protocolFeeBuffered : 10000n;\n return { fee: Number(minFee) / 1e6, maxFeeSubunits: minFee };\n }\n }\n } catch {\n // use fallback\n }\n return { fee: 0.25, maxFeeSubunits: 250000n };\n}\n\nexport function registerBridge(parent: Command, getOpts: () => OutputMode): void {\n parent\n .command(\"bridge\")\n .description(\"Cross-chain bridge: move assets between chains\")\n .requiredOption(\"--token <token>\", \"Token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount in wei\")\n .requiredOption(\"--to-chain <chain>\", \"Destination chain name\")\n .option(\"--recipient <address>\", \"Recipient address on destination chain\")\n .option(\"--slippage <bps>\", \"Slippage in bps (LI.FI only)\", \"50\")\n .option(\"--provider <name>\", \"Bridge provider: lifi, debridge, cctp\", \"lifi\")\n .action(async (opts) => {\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const fromChain = registry.getChain(chainName);\n const toChain = registry.getChain(opts.toChain);\n const tokenAddr = opts.token.startsWith(\"0x\") ? opts.token : registry.resolveToken(chainName, opts.token).address;\n const recipient = resolveWallet(opts.recipient);\n const provider = (opts.provider as string).toLowerCase();\n\n if (provider === \"debridge\") {\n try {\n const srcId = DLN_CHAIN_IDS[chainName] ?? fromChain.chain_id;\n const dstId = DLN_CHAIN_IDS[opts.toChain] ?? toChain.chain_id;\n\n const result = await getDebridgeQuote(\n srcId, dstId,\n tokenAddr, tokenAddr,\n opts.amount,\n recipient,\n );\n\n const tx = (result.raw as Record<string, unknown>).tx as Record<string, unknown> | undefined;\n printOutput({\n from_chain: fromChain.name, to_chain: toChain.name,\n token: tokenAddr, amount: opts.amount,\n bridge: \"deBridge DLN\",\n estimated_output: result.amountOut,\n estimated_time_seconds: result.estimatedTime,\n tx: tx ? { to: tx.to, data: tx.data, value: tx.value } : undefined,\n }, getOpts());\n } catch (e) {\n printOutput({ error: `deBridge API error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n if (provider === \"cctp\") {\n try {\n const srcDomain = CCTP_DOMAINS[chainName];\n const dstDomain = CCTP_DOMAINS[opts.toChain];\n\n if (srcDomain === undefined) {\n printOutput({ error: `CCTP not supported on source chain: ${chainName}. Supported: ${Object.keys(CCTP_DOMAINS).join(\", \")}` }, getOpts());\n return;\n }\n if (dstDomain === undefined) {\n printOutput({ error: `CCTP not supported on destination chain: ${opts.toChain}. Supported: ${Object.keys(CCTP_DOMAINS).join(\", \")}` }, getOpts());\n return;\n }\n\n const usdcSrc = CCTP_USDC_ADDRESSES[chainName];\n const usdcDst = CCTP_USDC_ADDRESSES[opts.toChain];\n if (!usdcSrc) {\n printOutput({ error: `No native USDC address known for ${chainName}. CCTP requires native USDC.` }, getOpts());\n return;\n }\n\n const amountUsdc = Number(BigInt(opts.amount)) / 1e6;\n const { fee, maxFeeSubunits } = await getCctpFeeEstimate(srcDomain, dstDomain, amountUsdc);\n\n // Build depositForBurn call data\n // TokenMessenger V2: depositForBurn(amount, destinationDomain, mintRecipient, burnToken, maxFee, minFinalityThreshold)\n // mintRecipient must be 32 bytes (left-padded address)\n const recipientPadded = `0x${\"0\".repeat(24)}${recipient.replace(\"0x\", \"\").toLowerCase()}` as `0x${string}`;\n\n const { encodeFunctionData, parseAbi } = await import(\"viem\");\n const tokenMessengerAbi = parseAbi([\n \"function depositForBurn(uint256 amount, uint32 destinationDomain, bytes32 mintRecipient, address burnToken, bytes32 destinationCaller, uint256 maxFee, uint32 minFinalityThreshold) external returns (uint64 nonce)\",\n ]);\n\n const data = encodeFunctionData({\n abi: tokenMessengerAbi,\n functionName: \"depositForBurn\",\n args: [\n BigInt(opts.amount),\n dstDomain,\n recipientPadded as `0x${string}`,\n usdcSrc as Address,\n `0x${\"0\".repeat(64)}` as `0x${string}`, // any caller\n maxFeeSubunits,\n 2000, // standard finality\n ],\n });\n\n printOutput({\n from_chain: fromChain.name, to_chain: toChain.name,\n token: usdcSrc,\n token_dst: usdcDst ?? tokenAddr,\n amount: opts.amount,\n bridge: \"Circle CCTP V2\",\n estimated_fee_usdc: fee,\n estimated_output: String(BigInt(opts.amount) - maxFeeSubunits),\n note: \"After burn, poll https://iris-api.circle.com/v2/messages/{srcDomain} for attestation, then call MessageTransmitter.receiveMessage() on destination\",\n tx: {\n to: CCTP_TOKEN_MESSENGER_V2,\n data,\n value: \"0x0\",\n },\n }, getOpts());\n } catch (e) {\n printOutput({ error: `CCTP error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n // Default: LI.FI\n try {\n const params = new URLSearchParams({\n fromChain: String(fromChain.chain_id), toChain: String(toChain.chain_id),\n fromToken: tokenAddr, toToken: tokenAddr,\n fromAmount: opts.amount, fromAddress: recipient,\n slippage: String(parseInt(opts.slippage) / 10000),\n });\n const res = await fetch(`${LIFI_API}/quote?${params}`);\n const quote = await res.json() as any;\n\n if (quote.transactionRequest) {\n printOutput({\n from_chain: fromChain.name, to_chain: toChain.name,\n token: tokenAddr, amount: opts.amount,\n bridge: quote.toolDetails?.name ?? \"LI.FI\",\n estimated_output: quote.estimate?.toAmount,\n tx: { to: quote.transactionRequest.to, data: quote.transactionRequest.data, value: quote.transactionRequest.value },\n }, getOpts());\n } else {\n printOutput({ error: \"No LI.FI route found\", details: quote }, getOpts());\n }\n } catch (e) {\n printOutput({ error: `LI.FI API error: ${errMsg(e)}` }, getOpts());\n }\n });\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport type { Executor } from \"../executor.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\nimport { requireChain, resolveTokenAddress, resolveWallet, errMsg, parseBigIntValue } from \"../utils.js\";\n\n// ── Chain name mappings ──\n\n// Aggregator chain slugs are now defined in chains.toml under `[chain.X.aggregators]`\n// and surfaced via ChainConfig.aggregators. This function preserves the legacy lookup\n// shape so the existing call sites stay readable.\nfunction getAggregatorSlugs(chainCfg: { aggregators?: { kyber?: string; openocean?: string; liquid?: string } }): { kyber?: string; openocean?: string; liquid?: string } {\n return chainCfg.aggregators ?? {};\n}\n\n// ── KyberSwap ──\n\nconst KYBER_API = \"https://aggregator-api.kyberswap.com\";\n\nasync function kyberGetQuote(\n chain: string,\n tokenIn: string,\n tokenOut: string,\n amountIn: string,\n): Promise<Record<string, unknown>> {\n const params = new URLSearchParams({ tokenIn, tokenOut, amountIn });\n const url = `${KYBER_API}/${chain}/api/v1/routes?${params}`;\n const res = await fetch(url, { headers: { \"x-client-id\": \"defi-cli\" } });\n if (!res.ok) throw new Error(`KyberSwap quote failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const data = json.data as Record<string, unknown> | undefined;\n if (!data?.routeSummary) throw new Error(`KyberSwap: no route found`);\n return data;\n}\n\nasync function kyberBuildTx(\n chain: string,\n routeSummary: unknown,\n sender: string,\n recipient: string,\n slippageTolerance: number,\n): Promise<{ to: string; data: string; value: string }> {\n const url = `${KYBER_API}/${chain}/api/v1/route/build`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"x-client-id\": \"defi-cli\" },\n body: JSON.stringify({ routeSummary, sender, recipient, slippageTolerance }),\n });\n if (!res.ok) throw new Error(`KyberSwap build failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const data = json.data as Record<string, unknown> | undefined;\n if (!data) throw new Error(\"KyberSwap: no build data\");\n return {\n to: String(data.routerAddress),\n data: String(data.data),\n value: String(data.value ?? \"0x0\"),\n };\n}\n\n// ── OpenOcean ──\n\nconst OPENOCEAN_API = \"https://open-api.openocean.finance/v4\";\n\nasync function openoceanSwap(\n chain: string,\n inTokenAddress: string,\n outTokenAddress: string,\n amountIn: string,\n slippagePct: string,\n account: string,\n): Promise<{ to: string; data: string; value: string; outAmount: string }> {\n const params = new URLSearchParams({\n inTokenAddress,\n outTokenAddress,\n amount: amountIn,\n gasPrice: \"0.1\",\n slippage: slippagePct,\n account,\n });\n const url = `${OPENOCEAN_API}/${chain}/swap?${params}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`OpenOcean swap failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const data = json.data as Record<string, unknown> | undefined;\n if (!data) throw new Error(\"OpenOcean: no swap data\");\n return {\n to: String(data.to),\n data: String(data.data),\n value: String(data.value ?? \"0x0\"),\n outAmount: String(data.outAmount ?? \"0\"),\n };\n}\n\n// ── LI.FI (multi-chain via chainId) ──\n//\n// API: GET https://li.quest/v1/quote — single same-chain swap or cross-chain bridge.\n// Supports most EVM chains (1, 42161, 8453, 56, 5000, …) via numeric chainId.\nconst LIFI_API = \"https://li.quest/v1\";\n\nasync function lifiQuote(\n chainId: number,\n fromToken: string,\n toToken: string,\n fromAmount: string,\n fromAddress: string,\n slippagePct: string,\n): Promise<{ to: string; data: string; value: string; outAmount: string }> {\n const params = new URLSearchParams({\n fromChain: String(chainId),\n toChain: String(chainId),\n fromToken,\n toToken,\n fromAmount,\n fromAddress,\n slippage: (Number(slippagePct) / 100).toFixed(4),\n });\n const url = `${LIFI_API}/quote?${params}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`LI.FI quote failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const txReq = json.transactionRequest as Record<string, unknown> | undefined;\n if (!txReq) throw new Error(\"LI.FI: no transactionRequest in response\");\n const estimate = json.estimate as Record<string, unknown> | undefined;\n return {\n to: String(txReq.to),\n data: String(txReq.data),\n value: String(txReq.value ?? \"0x0\"),\n outAmount: String(estimate?.toAmount ?? \"0\"),\n };\n}\n\n// ── Relay (multi-chain via chainId) ──\n//\n// API: POST https://api.relay.link/quote — single-chain swap or cross-chain.\n// Returns a multi-step plan; we always execute the first item (same-chain swap = single step).\nconst RELAY_API = \"https://api.relay.link\";\n\nasync function relayQuote(\n chainId: number,\n fromToken: string,\n toToken: string,\n amount: string,\n user: string,\n): Promise<{ to: string; data: string; value: string; outAmount: string }> {\n const body = {\n user,\n originChainId: chainId,\n destinationChainId: chainId,\n originCurrency: fromToken,\n destinationCurrency: toToken,\n recipient: user,\n tradeType: \"EXACT_INPUT\",\n amount,\n };\n const res = await fetch(`${RELAY_API}/quote`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new Error(`Relay quote failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const steps = json.steps as Array<Record<string, unknown>> | undefined;\n // Relay returns multiple steps (approve + swap). The executor handles approval via\n // the `approvals` array, so take the swap step (skipping any \"approve\" step).\n const swapStep = steps?.find((s) => s.id !== \"approve\") ?? steps?.[steps.length - 1];\n const items = swapStep?.items as Array<Record<string, unknown>> | undefined;\n const txData = items?.[0]?.data as Record<string, unknown> | undefined;\n if (!txData) throw new Error(\"Relay: no swap step in quote\");\n const details = json.details as Record<string, unknown> | undefined;\n const currencyOut = details?.currencyOut as Record<string, unknown> | undefined;\n return {\n to: String(txData.to),\n data: String(txData.data),\n value: String(txData.value ?? \"0x0\"),\n outAmount: String(currencyOut?.amount ?? \"0\"),\n };\n}\n\n// ── LiquidSwap (HyperEVM only) ──\n\nconst LIQD_API = \"https://api.liqd.ag/v2\";\nconst LIQD_ROUTER = \"0x744489ee3d540777a66f2cf297479745e0852f7a\";\n\nasync function liquidSwapRoute(\n tokenIn: string,\n tokenOut: string,\n amountIn: string,\n slippagePct: string,\n): Promise<{ to: string; data: string; value: string; outAmount: string }> {\n const params = new URLSearchParams({ tokenIn, tokenOut, amountIn, slippage: slippagePct });\n const url = `${LIQD_API}/route?${params}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`LiquidSwap route failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const execution = json.execution as Record<string, unknown> | undefined;\n if (!execution) throw new Error(\"LiquidSwap: no execution data in response\");\n const details = json.details as Record<string, unknown> | undefined;\n return {\n to: String(execution.to ?? LIQD_ROUTER),\n data: String(execution.calldata),\n value: String(execution.value ?? \"0x0\"),\n outAmount: String(details?.amountOut ?? json.amountOut ?? \"0\"),\n };\n}\n\n// ── Command registration ──\n\nexport function registerSwap(\n parent: Command,\n getOpts: () => OutputMode,\n makeExecutor: () => Executor,\n): void {\n parent\n .command(\"swap\")\n .description(\"Swap tokens via DEX aggregator (KyberSwap, OpenOcean, LiquidSwap, LI.FI, Relay)\")\n .requiredOption(\"--from <token>\", \"Input token symbol or address\")\n .requiredOption(\"--to <token>\", \"Output token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount of input token in wei\")\n .option(\"--provider <name>\", \"Aggregator: kyber, openocean, liquid, lifi, relay\", \"kyber\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps\", \"50\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const provider = (opts.provider as string).toLowerCase();\n const slippageBps = parseInt(opts.slippage as string, 10);\n\n // Resolve token addresses\n const fromAddr: string = resolveTokenAddress(registry, chainName, opts.from as string);\n const toAddr: string = resolveTokenAddress(registry, chainName, opts.to as string);\n\n const wallet = resolveWallet();\n\n if (provider === \"kyber\") {\n const aggCfg = getAggregatorSlugs(registry.getChain(chainName));\n if (!aggCfg.kyber) {\n const supported = Array.from(registry.chains.keys()).filter((c) => registry.getChain(c).aggregators?.kyber).join(\", \");\n printOutput({ error: `KyberSwap: unsupported chain '${chainName}'. Supported: ${supported || \"(none)\"}` }, getOpts());\n return;\n }\n const kyberChain = aggCfg.kyber;\n\n try {\n const quoteData = await kyberGetQuote(kyberChain, fromAddr, toAddr, opts.amount as string);\n const routeSummary = quoteData.routeSummary as Record<string, unknown>;\n const amountOut = String((routeSummary as Record<string, unknown>).amountOut ?? \"0\");\n\n // Build tx for the executor\n const txData = await kyberBuildTx(\n kyberChain,\n routeSummary,\n wallet,\n wallet,\n slippageBps,\n );\n\n const tx = {\n description: `KyberSwap: swap ${opts.amount} of ${fromAddr} -> ${toAddr}`,\n to: txData.to as Address,\n data: txData.data as `0x${string}`,\n value: parseBigIntValue(txData.value),\n approvals: [{ token: fromAddr as Address, spender: txData.to as Address, amount: BigInt(opts.amount as string) }],\n };\n\n const result = await executor.execute(tx);\n printOutput({\n provider: \"kyber\",\n chain: kyberChain,\n from_token: fromAddr,\n to_token: toAddr,\n amount_in: opts.amount,\n amount_out: amountOut,\n router: txData.to,\n ...result,\n }, getOpts());\n } catch (e) {\n printOutput({ error: `KyberSwap error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n if (provider === \"openocean\") {\n const aggCfg = getAggregatorSlugs(registry.getChain(chainName));\n if (!aggCfg.openocean) {\n const supported = Array.from(registry.chains.keys()).filter((c) => registry.getChain(c).aggregators?.openocean).join(\", \");\n printOutput({ error: `OpenOcean: unsupported chain '${chainName}'. Supported: ${supported || \"(none)\"}` }, getOpts());\n return;\n }\n const ooChain = aggCfg.openocean;\n // OpenOcean amount is human-readable — convert wei to decimal\n const fromToken = (opts.from as string).startsWith(\"0x\")\n ? registry.tokens.get(chainName)?.find(t => t.address.toLowerCase() === (opts.from as string).toLowerCase())\n : registry.tokens.get(chainName)?.find(t => t.symbol.toLowerCase() === (opts.from as string).toLowerCase());\n const fromDecimals = fromToken?.decimals ?? 18;\n const humanAmount = (Number(opts.amount) / 10 ** fromDecimals).toString();\n const slippagePct = (slippageBps / 100).toFixed(2);\n\n try {\n const swap = await openoceanSwap(\n ooChain,\n fromAddr,\n toAddr,\n humanAmount,\n slippagePct,\n wallet,\n );\n\n const tx = {\n description: `OpenOcean: swap ${opts.amount} of ${fromAddr} -> ${toAddr}`,\n to: swap.to as Address,\n data: swap.data as `0x${string}`,\n value: parseBigIntValue(swap.value),\n approvals: [{ token: fromAddr as Address, spender: swap.to as Address, amount: BigInt(opts.amount as string) }],\n };\n\n const result = await executor.execute(tx);\n printOutput({\n provider: \"openocean\",\n chain: ooChain,\n from_token: fromAddr,\n to_token: toAddr,\n amount_in: opts.amount,\n amount_out: swap.outAmount,\n router: swap.to,\n ...result,\n }, getOpts());\n } catch (e) {\n printOutput({ error: `OpenOcean error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n if (provider === \"liquid\") {\n if (chainName !== \"hyperevm\") {\n printOutput({ error: `LiquidSwap only supports hyperevm, got '${chainName}'` }, getOpts());\n return;\n }\n const slippagePct = (slippageBps / 100).toFixed(2);\n\n try {\n const route = await liquidSwapRoute(fromAddr, toAddr, opts.amount as string, slippagePct);\n\n const tx = {\n description: `LiquidSwap: swap ${opts.amount} of ${fromAddr} -> ${toAddr}`,\n to: route.to as Address,\n data: route.data as `0x${string}`,\n value: parseBigIntValue(route.value),\n approvals: [{ token: fromAddr as Address, spender: route.to as Address, amount: BigInt(opts.amount as string) }],\n };\n\n const result = await executor.execute(tx);\n printOutput({\n provider: \"liquid\",\n chain: chainName,\n from_token: fromAddr,\n to_token: toAddr,\n amount_in: opts.amount,\n amount_out: route.outAmount,\n router: route.to,\n ...result,\n }, getOpts());\n } catch (e) {\n printOutput({ error: `LiquidSwap error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n if (provider === \"lifi\" || provider === \"relay\") {\n const chainCfg = registry.getChain(chainName);\n const chainId = chainCfg.chain_id;\n if (!chainId) {\n printOutput({ error: `${provider}: chain '${chainName}' has no chain_id in registry` }, getOpts());\n return;\n }\n const slippagePct = (slippageBps / 100).toFixed(2);\n try {\n const route = provider === \"lifi\"\n ? await lifiQuote(chainId, fromAddr, toAddr, opts.amount as string, wallet, slippagePct)\n : await relayQuote(chainId, fromAddr, toAddr, opts.amount as string, wallet);\n const tx = {\n description: `${provider}: swap ${opts.amount} of ${fromAddr} -> ${toAddr}`,\n to: route.to as Address,\n data: route.data as `0x${string}`,\n value: parseBigIntValue(route.value),\n approvals: [{ token: fromAddr as Address, spender: route.to as Address, amount: BigInt(opts.amount as string) }],\n };\n const result = await executor.execute(tx);\n printOutput({\n provider,\n chain: chainName,\n chain_id: chainId,\n from_token: fromAddr,\n to_token: toAddr,\n amount_in: opts.amount,\n amount_out: route.outAmount,\n router: route.to,\n ...result,\n }, getOpts());\n } catch (e) {\n printOutput({ error: `${provider} error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n printOutput({ error: `Unknown provider '${opts.provider}'. Choose: kyber, openocean, liquid, lifi, relay` }, getOpts());\n });\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { createInterface } from \"readline\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { resolve } from \"path\";\n\nconst DEFI_DIR = resolve(process.env.HOME || \"~\", \".defi\");\nconst ENV_FILE = resolve(DEFI_DIR, \".env\");\n\n// ── .env helpers ──────────────────────────────────────────────\n\nfunction ensureDefiDir() {\n if (!existsSync(DEFI_DIR)) mkdirSync(DEFI_DIR, { recursive: true, mode: 0o700 });\n}\n\nfunction loadEnvFile(): Record<string, string> {\n if (!existsSync(ENV_FILE)) return {};\n const lines = readFileSync(ENV_FILE, \"utf-8\").split(\"\\n\");\n const env: Record<string, string> = {};\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx > 0) {\n env[trimmed.slice(0, eqIdx)] = trimmed.slice(eqIdx + 1);\n }\n }\n return env;\n}\n\nfunction writeEnvFile(env: Record<string, string>) {\n ensureDefiDir();\n const lines = [\n \"# defi-cli configuration\",\n \"# Generated by 'defi setup' — edit freely\",\n \"\",\n ];\n for (const [key, value] of Object.entries(env)) {\n lines.push(`${key}=${value}`);\n }\n lines.push(\"\");\n writeFileSync(ENV_FILE, lines.join(\"\\n\"), { mode: 0o600 });\n}\n\n// ── Interactive helpers ────────────────────────────────────────\n\nfunction ask(rl: ReturnType<typeof createInterface>, question: string): Promise<string> {\n return new Promise((res) => rl.question(question, (answer) => res(answer.trim())));\n}\n\n// ── Validation helpers ─────────────────────────────────────────\n\nfunction isValidAddress(s: string): boolean {\n return /^0x[0-9a-fA-F]{40}$/.test(s);\n}\n\nfunction isValidPrivateKey(s: string): boolean {\n return /^0x[0-9a-fA-F]{64}$/.test(s);\n}\n\nasync function deriveAddress(privateKey: string): Promise<string | null> {\n try {\n const { privateKeyToAccount } = await import(\"viem/accounts\");\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n return account.address;\n } catch {\n return null;\n }\n}\n\n// ── Command ────────────────────────────────────────────────────\n\nexport function registerSetup(program: Command) {\n program\n .command(\"setup\")\n .alias(\"init\")\n .description(\"Interactive setup wizard — configure wallet & RPC URLs\")\n .action(async () => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n console.log(pc.cyan(pc.bold(\"\\n defi-cli Setup Wizard\\n\")));\n\n // Show current config if it exists\n const existing = loadEnvFile();\n if (Object.keys(existing).length > 0) {\n console.log(pc.white(\" Current configuration:\"));\n for (const [key, value] of Object.entries(existing)) {\n const masked =\n key.toLowerCase().includes(\"key\")\n ? value.slice(0, 6) + \"...\" + value.slice(-4)\n : value;\n console.log(` ${pc.cyan(key.padEnd(24))} ${pc.gray(masked)}`);\n }\n console.log();\n const overwrite = await ask(rl, \" Overwrite existing config? (y/N): \");\n if (overwrite.toLowerCase() !== \"y\" && overwrite.toLowerCase() !== \"yes\") {\n console.log(pc.gray(\"\\n Keeping existing configuration.\\n\"));\n rl.close();\n return;\n }\n console.log();\n }\n\n const newEnv: Record<string, string> = {};\n\n // ── Wallet address / private key ──\n console.log(pc.cyan(pc.bold(\" Wallet\")));\n\n const privateKey = await ask(rl, \" Private key (optional, for --broadcast, 0x...): \");\n if (privateKey) {\n const normalized = privateKey.startsWith(\"0x\") ? privateKey : `0x${privateKey}`;\n if (!isValidPrivateKey(normalized)) {\n console.log(pc.red(\" Invalid private key (must be 0x + 64 hex chars). Skipped.\"));\n } else {\n newEnv.DEFI_PRIVATE_KEY = normalized;\n const derived = await deriveAddress(normalized);\n if (derived) {\n newEnv.DEFI_WALLET_ADDRESS = derived;\n console.log(` ${pc.green(\"OK\")} derived address: ${pc.gray(derived)}`);\n }\n }\n }\n\n if (!newEnv.DEFI_WALLET_ADDRESS) {\n const address = await ask(rl, \" Wallet address (0x...): \");\n if (address) {\n if (!isValidAddress(address)) {\n console.log(pc.yellow(\" Invalid address format. Skipping.\"));\n } else {\n newEnv.DEFI_WALLET_ADDRESS = address;\n console.log(` ${pc.green(\"OK\")} ${pc.gray(address)}`);\n }\n }\n }\n\n // ── RPC URLs ──\n console.log(pc.cyan(pc.bold(\"\\n RPC URLs\")) + pc.gray(\" (press Enter to use public defaults)\"));\n\n const hyperevmRpc = await ask(rl, \" HyperEVM RPC URL: \");\n if (hyperevmRpc) {\n newEnv.HYPEREVM_RPC_URL = hyperevmRpc;\n console.log(` ${pc.green(\"OK\")} HyperEVM RPC set`);\n }\n\n const mantleRpc = await ask(rl, \" Mantle RPC URL: \");\n if (mantleRpc) {\n newEnv.MANTLE_RPC_URL = mantleRpc;\n console.log(` ${pc.green(\"OK\")} Mantle RPC set`);\n }\n\n // Merge with existing non-overwritten keys (keep old keys not touched above)\n const finalEnv = { ...existing, ...newEnv };\n\n // Write .env\n writeEnvFile(finalEnv);\n\n // Summary\n console.log(pc.cyan(pc.bold(\"\\n Setup Complete!\\n\")));\n console.log(` Config: ${pc.gray(ENV_FILE)}`);\n if (finalEnv.DEFI_WALLET_ADDRESS) {\n console.log(` Wallet: ${pc.gray(finalEnv.DEFI_WALLET_ADDRESS)}`);\n }\n if (finalEnv.DEFI_PRIVATE_KEY) {\n console.log(` Key: ${pc.green(\"configured\")}`);\n }\n if (finalEnv.HYPEREVM_RPC_URL) {\n console.log(` HyperEVM RPC: ${pc.gray(finalEnv.HYPEREVM_RPC_URL)}`);\n }\n if (finalEnv.MANTLE_RPC_URL) {\n console.log(` Mantle RPC: ${pc.gray(finalEnv.MANTLE_RPC_URL)}`);\n }\n\n console.log(pc.bold(pc.white(\"\\n Next steps:\")));\n console.log(` ${pc.green(\"defi portfolio\")} view balances & positions`);\n console.log(` ${pc.green(\"defi scan\")} scan for exploits`);\n console.log(` ${pc.green(\"defi dex quote\")} get a swap quote`);\n console.log(` ${pc.green(\"defi --help\")} browse all commands\\n`);\n\n rl.close();\n } catch (err) {\n rl.close();\n throw err;\n }\n });\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { loadOws } from \"../signer/ows-loader.js\";\nimport { createPublicClient, http, formatEther } from \"viem\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport { errMsg } from \"../utils.js\";\n\n// ── Balance helper (EVM only for defi-cli) ──\n\nasync function getEvmBalance(\n address: string,\n chainName: string,\n): Promise<{ native_token: string; balance: string; balance_wei: string }> {\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const client = createPublicClient({ transport: http(chain.effectiveRpcUrl()) });\n const balance = await client.getBalance({ address: address as `0x${string}` });\n return {\n native_token: chain.native_token,\n balance: formatEther(balance),\n balance_wei: balance.toString(),\n };\n}\n\n// ── Table helper (inline, no external dep) ──\n\nfunction makeTable(headers: string[], rows: string[][]): string {\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => stripAnsi(r[i] ?? \"\").length)),\n );\n const sep = widths.map((w) => \"-\".repeat(w + 2)).join(\"+\");\n const fmtRow = (cells: string[]) =>\n cells.map((c, i) => ` ${padEnd(c, widths[i])} `).join(\"|\");\n return [fmtRow(headers.map((h) => pc.bold(h))), sep, ...rows.map(fmtRow)].join(\"\\n\");\n}\n\nfunction stripAnsi(s: string): string {\n // eslint-disable-next-line no-control-regex\n return s.replace(/\\x1B\\[\\d+m/g, \"\");\n}\n\nfunction padEnd(s: string, len: number): string {\n const visible = stripAnsi(s).length;\n return visible >= len ? s : s + \" \".repeat(len - visible);\n}\n\n// ── Register OWS commands ──\n\nexport function registerOws(parent: Command, getOpts: () => OutputMode): void {\n const ows = parent\n .command(\"ows\")\n .description(\"Open Wallet Standard — encrypted vault wallet management\");\n\n // ── create ──\n\n ows\n .command(\"create <name>\")\n .description(\"Create a new OWS wallet (multi-chain)\")\n .option(\"--words <count>\", \"Mnemonic word count (12 or 24)\", \"12\")\n .action(async (name: string, opts: { words: string }) => {\n try {\n const o = loadOws();\n const w = o.createWallet(name, \"\", parseInt(opts.words));\n const mode = getOpts();\n if (mode.json) {\n return printOutput(\n { id: w.id, name: w.name, accounts: w.accounts, createdAt: w.createdAt },\n mode,\n );\n }\n console.log(pc.cyan(pc.bold(\"\\n OWS Wallet Created\\n\")));\n console.log(` Name: ${pc.bold(w.name)}`);\n console.log(` ID: ${pc.gray(w.id)}`);\n console.log();\n for (const acct of w.accounts) {\n const chain = acct.chainId.split(\":\")[0];\n console.log(` ${pc.cyan(chain.padEnd(10))} ${pc.green(acct.address)}`);\n }\n console.log(pc.gray(`\\n Vault: ~/.ows/`));\n console.log(pc.cyan(`\\n Usage: defi --wallet ${name} lp deposit ...\\n`));\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n\n // ── list ──\n\n ows\n .command(\"list\")\n .description(\"List all OWS wallets in the vault\")\n .action(async () => {\n try {\n const o = loadOws();\n const wallets = o.listWallets();\n const mode = getOpts();\n if (mode.json) return printOutput({ wallets }, mode);\n if (wallets.length === 0) {\n console.log(pc.gray(\"\\n No OWS wallets found.\"));\n console.log(pc.gray(` Create one: ${pc.cyan(\"defi ows create <name>\")}\\n`));\n return;\n }\n console.log(pc.cyan(pc.bold(\"\\n OWS Vault Wallets\\n\")));\n const rows = wallets.map(\n (w: {\n name: string;\n id: string;\n accounts: Array<{ chainId: string; address: string }>;\n createdAt: string;\n }) => {\n const evmAddr =\n w.accounts.find((a: { chainId: string }) => a.chainId.startsWith(\"eip155:\"))\n ?.address ?? \"-\";\n const short =\n evmAddr.length > 14\n ? evmAddr.slice(0, 10) + \"...\" + evmAddr.slice(-4)\n : evmAddr;\n return [\n pc.bold(w.name),\n pc.green(short),\n pc.gray(w.createdAt.split(\"T\")[0]),\n ];\n },\n );\n console.log(makeTable([\"Name\", \"EVM Address\", \"Created\"], rows));\n console.log(pc.gray(`\\n Usage: defi --wallet <name> lp deposit ...\\n`));\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n\n // ── address ──\n\n ows\n .command(\"address <name>\")\n .description(\"Show EVM address for an OWS wallet\")\n .action(async (name: string) => {\n try {\n const o = loadOws();\n const w = o.getWallet(name);\n const evmAccount = w.accounts.find(\n (a: { chainId: string }) => a.chainId.startsWith(\"eip155:\"),\n );\n if (!evmAccount) throw new Error(`OWS wallet \"${name}\" has no EVM account`);\n const mode = getOpts();\n if (mode.json) return printOutput({ wallet: name, address: evmAccount.address }, mode);\n console.log(pc.cyan(pc.bold(`\\n OWS Wallet: ${name}\\n`)));\n console.log(` EVM Address: ${pc.green(evmAccount.address)}\\n`);\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n\n // ── balance ──\n\n ows\n .command(\"balance <name>\")\n .description(\"Show on-chain balance for an OWS wallet\")\n .action(async (name: string) => {\n try {\n const o = loadOws();\n const w = o.getWallet(name);\n const evmAccount = w.accounts.find(\n (a: { chainId: string }) => a.chainId.startsWith(\"eip155:\"),\n );\n if (!evmAccount) throw new Error(`OWS wallet \"${name}\" has no EVM account`);\n\n const chainOpt = parent.opts<{ chain?: string }>().chain;\n const chainName = chainOpt ?? \"hyperevm\";\n const bal = await getEvmBalance(evmAccount.address, chainName);\n const mode = getOpts();\n if (mode.json) {\n return printOutput(\n { wallet: name, chain: chainName, address: evmAccount.address, ...bal },\n mode,\n );\n }\n console.log(pc.cyan(pc.bold(`\\n ${name} — ${chainName}\\n`)));\n console.log(` Address: ${pc.green(evmAccount.address)}`);\n console.log(` ${pc.bold(bal.native_token)}: ${bal.balance}\\n`);\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n\n // ── delete ──\n\n ows\n .command(\"delete <name>\")\n .description(\"Delete an OWS wallet from the vault\")\n .action(async (name: string) => {\n try {\n const o = loadOws();\n const w = o.getWallet(name);\n o.deleteWallet(name);\n const mode = getOpts();\n if (mode.json) return printOutput({ deleted: name, id: w.id }, mode);\n console.log(pc.yellow(`\\n OWS wallet \"${name}\" deleted from vault.\\n`));\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n\n // ── info ──\n\n ows\n .command(\"info <name>\")\n .description(\"Show detailed OWS wallet info (all chains & derivation paths)\")\n .action(async (name: string) => {\n try {\n const o = loadOws();\n const w = o.getWallet(name);\n const mode = getOpts();\n if (mode.json) return printOutput(w, mode);\n console.log(pc.cyan(pc.bold(`\\n OWS Wallet: ${w.name}\\n`)));\n console.log(` ID: ${pc.gray(w.id)}`);\n console.log(` Created: ${pc.gray(w.createdAt)}`);\n console.log();\n for (const acct of w.accounts) {\n console.log(` ${pc.cyan(acct.chainId.padEnd(40))} ${pc.green(acct.address)}`);\n console.log(` ${pc.gray(\" \".repeat(40) + acct.derivationPath)}`);\n }\n console.log();\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n}\n\n// ── Error handler ──\n\nfunction handleOwsError(e: unknown, getOpts: () => OutputMode): void {\n const msg = errMsg(e);\n const mode = getOpts();\n if (mode.json) {\n printOutput({ error: msg }, mode);\n } else {\n console.error(pc.red(`\\n OWS error: ${msg}\\n`));\n }\n process.exit(1);\n}\n"],"mappings":"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","names":["encodeFunctionData","parseAbi","TxStatus","InterestRateMode","ProtocolCategory","encodeFunctionData","parseAbi","createPublicClient","http","decodeFunctionResult","decodeAbiParameters","zeroAddress","decodeAddress","_addressDecodeAbi","decodeSymbol","_symbolDecodeAbi","erc20Abi","u256ToF64","DefiError","abi","veAbi","voterAbi","lbQuoterAbi","HYPEREVM_TOKENS","positionManagerAbi","ERC20_ABI","POOL_ABI","ORACLE_ABI","SECONDS_PER_YEAR","ERC4626_ABI","client","amountOut","best","errMsg","poolAbi","result","multicallRead","algebraFactoryAbi","data","ids","priceX","priceY","decX","decY","MAX_UINT256","InterestRateMode","decodeU256","createRequire","createPublicClient","http","parseAbi","encodeFunctionData","errMsg","jsonVal","createPublicClient","http","init_dist","parseAbi","encodeFunctionData","decodeFunctionResult","createPublicClient","http","zeroAddress","readFileSync","resolve","parse","privateKeyToAccount","privateKeyToAccount","parseAbi","ERC20_DECIMALS_ABI","createOracleFromLending","encodeFunctionData","decodeFunctionResult","chain","makeExecutor","createPublicClient","http","lp","zeroAddress","poolAbi","tx","result","gaugeAdapter","erc20Abi","tokenA","tokenB","init_dist","makeExecutor","init_dist","makeExecutor","amountWei","encodeFunctionData","parseAbi","readdirSync","readFileSync","existsSync","resolve","encodeFunctionData","parseAbi","ERC20_ABI","ORACLE_ABI","POOL_ABI","ERC20_ABI","parseAbi","POOL_ABI","ORACLE_ABI","decodeU256","encodeFunctionData","init_dist","resolveAsset","createPublicClient","http","createPublicClient","http","createPublicClient","http","makeExecutor","createPublicClient","http","encodeFunctionData","parseAbi","LIFI_API","makeExecutor","pc","existsSync","mkdirSync","readFileSync","writeFileSync","resolve","privateKeyToAccount","program","pc","createPublicClient","http","formatEther","createPublicClient","http","formatEther","makeTable","pc","_require","createRequire"]}
1
+ {"version":3,"sources":["../../defi-core/src/types.ts","../../defi-core/src/error.ts","../../defi-core/src/json.ts","../../defi-core/src/erc20.ts","../../defi-core/src/provider.ts","../../defi-core/src/multicall.ts","../../defi-core/src/registry/chain.ts","../../defi-core/src/registry/protocol.ts","../../defi-core/src/registry/registry.ts","../../defi-protocols/src/factory.ts","../../defi-protocols/src/dex/uniswap_v3.ts","../../defi-protocols/src/dex/uniswap_v2.ts","../../defi-protocols/src/dex/algebra_v3.ts","../../defi-protocols/src/dex/tick_math.ts","../../defi-protocols/src/dex/balancer_v3.ts","../../defi-protocols/src/dex/curve.ts","../../defi-protocols/src/dex/solidly.ts","../../defi-protocols/src/dex/thena_cl.ts","../../defi-protocols/src/dex/hybra_gauge.ts","../../defi-protocols/src/dex/woofi.ts","../../defi-protocols/src/dex/solidly_gauge.ts","../../defi-protocols/src/dex/masterchef.ts","../../defi-protocols/src/dex/merchant_moe_lb.ts","../../defi-protocols/src/dex/kittenswap_farming.ts","../../defi-protocols/src/dex/nest_offchain.ts","../../defi-protocols/src/lending/aave_v3.ts","../../defi-protocols/src/lending/aave_v2.ts","../../defi-protocols/src/lending/aave_oracle.ts","../../defi-protocols/src/lending/compound_v2.ts","../../defi-protocols/src/lending/compound_v3.ts","../../defi-protocols/src/lending/euler_v2.ts","../../defi-protocols/src/lending/morpho.ts","../../defi-protocols/src/cdp/felix.ts","../../defi-protocols/src/cdp/felix_oracle.ts","../../defi-protocols/src/vault/erc4626.ts","../../defi-protocols/src/liquid_staking/generic_lst.ts","../../defi-protocols/src/liquid_staking/sthype.ts","../../defi-protocols/src/liquid_staking/kinetiq.ts","../../defi-protocols/src/yield_source/pendle.ts","../../defi-protocols/src/yield_source/generic_yield.ts","../../defi-protocols/src/derivatives/hlp.ts","../../defi-protocols/src/derivatives/generic_derivatives.ts","../../defi-protocols/src/options/rysk.ts","../../defi-protocols/src/options/generic_options.ts","../../defi-protocols/src/nft/erc721.ts","../../defi-protocols/src/dex/dex_price.ts","../src/cli.ts","../src/executor.ts","../src/output.ts","../src/table.ts","../src/commands/status.ts","../src/agent.ts","../src/commands/schema.ts","../src/commands/lp.ts","../src/whitelist.ts","../src/signer/resolve.ts","../src/signer/ows-loader.ts","../src/signer/ows-evm.ts","../src/commands/lending.ts","../src/utils.ts","../src/commands/yield.ts","../src/commands/portfolio.ts","../src/portfolio-tracker.ts","../src/commands/price.ts","../src/commands/wallet.ts","../src/commands/token.ts","../src/commands/bridge.ts","../src/commands/swap.ts","../src/commands/setup.ts","../src/commands/ows.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\n\n// === Transaction Types ===\n\n/** A built DeFi transaction ready for simulation or broadcast */\nexport interface DeFiTx {\n description: string;\n to: Address;\n data: Hex;\n value: bigint;\n gas_estimate?: number;\n /** ERC20 approvals to check and send before broadcasting this tx */\n approvals?: Array<{\n token: Address;\n spender: Address;\n amount: bigint;\n }>;\n /** Pre-transactions to execute before the main tx (e.g. farming approval) */\n pre_txs?: DeFiTx[];\n}\n\n/** Result of executing or simulating a transaction */\nexport interface ActionResult {\n tx_hash?: string;\n status: TxStatus;\n gas_used?: number;\n description: string;\n details: Record<string, unknown>;\n}\n\n/** Transaction status (serde: snake_case) */\nexport enum TxStatus {\n DryRun = \"dry_run\",\n Simulated = \"simulated\",\n SimulationFailed = \"simulation_failed\",\n NeedsApproval = \"needs_approval\",\n Pending = \"pending\",\n Confirmed = \"confirmed\",\n Failed = \"failed\",\n}\n\n// === Token Types ===\n\n/** Token amount with decimals-aware formatting */\nexport interface TokenAmount {\n token: Address;\n symbol: string;\n amount: bigint;\n decimals: number;\n}\n\nexport function formatHuman(t: TokenAmount): string {\n const divisor = 10n ** BigInt(t.decimals);\n const whole = t.amount / divisor;\n const frac = t.amount % divisor;\n return `${whole}.${frac.toString().padStart(t.decimals, \"0\")} ${t.symbol}`;\n}\n\n/** Slippage tolerance in basis points */\nexport interface Slippage {\n bps: number;\n}\n\nexport function newSlippage(bps: number): Slippage {\n return { bps };\n}\n\nexport function defaultSwapSlippage(): Slippage {\n return { bps: 50 };\n}\n\nexport function applyMinSlippage(slippage: Slippage, amount: bigint): bigint {\n return (amount * BigInt(10000 - slippage.bps)) / 10000n;\n}\n\n// === Oracle / Price Types ===\n\nexport interface PriceData {\n source: string;\n source_type: string;\n asset: Address;\n price_usd: bigint;\n price_f64: number;\n block_number?: number;\n timestamp?: number;\n}\n\n// === DEX Types ===\n\nexport interface SwapParams {\n protocol: string;\n token_in: Address;\n token_out: Address;\n amount_in: bigint;\n slippage: Slippage;\n recipient: Address;\n deadline?: number;\n}\n\nexport interface QuoteParams {\n protocol: string;\n token_in: Address;\n token_out: Address;\n amount_in: bigint;\n}\n\nexport interface QuoteResult {\n protocol: string;\n amount_out: bigint;\n price_impact_bps?: number;\n fee_bps?: number;\n route: string[];\n}\n\nexport interface AddLiquidityParams {\n protocol: string;\n token_a: Address;\n token_b: Address;\n amount_a: bigint;\n amount_b: bigint;\n recipient: Address;\n /** Optional lower tick for concentrated LP (defaults to full range) */\n tick_lower?: number;\n /** Optional upper tick for concentrated LP (defaults to full range) */\n tick_upper?: number;\n /** ±N% concentrated range around current price (e.g. 2 for ±2%) */\n range_pct?: number;\n /** Optional pool address for tick detection / single-side LP */\n pool?: Address;\n}\n\nexport interface RemoveLiquidityParams {\n protocol: string;\n token_a: Address;\n token_b: Address;\n liquidity: bigint;\n recipient: Address;\n /** NFT tokenId for V3 / CL position managers (required for V3-style removes) */\n token_id?: bigint;\n}\n\n// === Lending Types ===\n\nexport interface SupplyParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n on_behalf_of: Address;\n}\n\nexport interface BorrowParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n interest_rate_mode: InterestRateMode;\n on_behalf_of: Address;\n}\n\n/** Interest rate mode (serde: snake_case) */\nexport enum InterestRateMode {\n Variable = \"variable\",\n Stable = \"stable\",\n}\n\nexport interface RepayParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n interest_rate_mode: InterestRateMode;\n on_behalf_of: Address;\n}\n\nexport interface WithdrawParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n to: Address;\n}\n\nexport interface LendingRates {\n protocol: string;\n asset: Address;\n supply_apy: number;\n borrow_variable_apy: number;\n borrow_stable_apy?: number;\n utilization: number;\n total_supply: bigint;\n total_borrow: bigint;\n /** Reward token addresses for supply-side incentives */\n supply_reward_tokens?: string[];\n /** Reward token addresses for borrow-side incentives */\n borrow_reward_tokens?: string[];\n /** Emissions per second per supply reward token (raw uint256 as string) */\n supply_emissions_per_second?: string[];\n /** Emissions per second per borrow reward token (raw uint256 as string) */\n borrow_emissions_per_second?: string[];\n /** Supply-side incentive APY (%) from reward token emissions */\n supply_incentive_apy?: number;\n /** Borrow-side incentive APY (%) from reward token emissions (negative = subsidized) */\n borrow_incentive_apy?: number;\n}\n\nexport interface UserPosition {\n protocol: string;\n user: Address;\n supplies: PositionAsset[];\n borrows: PositionAsset[];\n health_factor?: number;\n net_apy?: number;\n}\n\nexport interface PositionAsset {\n asset: Address;\n symbol: string;\n amount: bigint;\n value_usd?: number;\n}\n\n// === CDP Types ===\n\nexport interface OpenCdpParams {\n protocol: string;\n collateral: Address;\n collateral_amount: bigint;\n debt_amount: bigint;\n recipient: Address;\n}\n\nexport interface AdjustCdpParams {\n protocol: string;\n cdp_id: bigint;\n collateral_delta?: bigint;\n debt_delta?: bigint;\n add_collateral: boolean;\n add_debt: boolean;\n}\n\nexport interface CloseCdpParams {\n protocol: string;\n cdp_id: bigint;\n}\n\nexport interface CdpInfo {\n protocol: string;\n cdp_id: bigint;\n collateral: TokenAmount;\n debt: TokenAmount;\n collateral_ratio: number;\n liquidation_price?: number;\n}\n\n// === Liquid Staking Types ===\n\nexport interface StakeParams {\n protocol: string;\n amount: bigint;\n recipient: Address;\n}\n\nexport interface UnstakeParams {\n protocol: string;\n amount: bigint;\n recipient: Address;\n}\n\nexport interface StakingInfo {\n protocol: string;\n staked_token: Address;\n liquid_token: Address;\n exchange_rate: number;\n apy?: number;\n total_staked: bigint;\n}\n\n// === Vault Types (ERC-4626) ===\n\nexport interface VaultInfo {\n protocol: string;\n vault_address: Address;\n asset: Address;\n total_assets: bigint;\n total_supply: bigint;\n apy?: number;\n}\n\n// === Derivatives Types ===\n\nexport interface DerivativesPositionParams {\n protocol: string;\n market: string;\n size: bigint;\n collateral: bigint;\n is_long: boolean;\n}\n\n// === Options Types ===\n\nexport interface OptionParams {\n protocol: string;\n underlying: Address;\n strike_price: bigint;\n expiry: number;\n is_call: boolean;\n amount: bigint;\n}\n\n// === ve(3,3) Types ===\n\n/** A pool that has an active emission gauge */\nexport interface GaugedPool {\n pool: Address;\n gauge: Address;\n token0: string; // symbol\n token1: string; // symbol\n token0Addr?: Address;\n token1Addr?: Address;\n type: \"V2\" | \"CL\";\n tickSpacing?: number; // for CL pools\n stable?: boolean; // for V2 pools\n /** Reward rate in wei per second (from gauge.rewardRate or rewardData) */\n rewardRate?: bigint;\n /** Total LP staked in gauge (wei) */\n totalStaked?: bigint;\n /** Reward token address */\n rewardToken?: Address;\n /** Calculated emission APR (%) — set by caller if prices available */\n aprPercent?: number;\n /** Pool TVL in USD — set by caller if prices available */\n poolTvlUsd?: number;\n}\n\nexport interface RewardInfo {\n token: Address;\n symbol: string;\n amount: bigint;\n value_usd?: number;\n}\n\nexport interface GaugeInfo {\n gauge: Address;\n pool: Address;\n total_staked: bigint;\n reward_rate: bigint;\n rewards: RewardInfo[];\n}\n\nexport interface VeNftInfo {\n token_id: bigint;\n amount: bigint;\n unlock_time: number;\n voting_power: bigint;\n}\n\n// === Yield Types ===\n\nexport interface YieldInfo {\n protocol: string;\n pool: string;\n apy: number;\n tvl: bigint;\n tokens: Address[];\n}\n\n// === Portfolio Tracker Types ===\nexport interface PortfolioSnapshot {\n timestamp: number;\n chain: string;\n wallet: string;\n tokens: TokenBalance[];\n defi_positions: DefiPosition[];\n total_value_usd: number;\n}\n\nexport interface TokenBalance {\n token: string;\n symbol: string;\n balance: bigint;\n value_usd: number;\n price_usd: number;\n}\n\nexport interface DefiPosition {\n protocol: string;\n type: \"lending_supply\" | \"lending_borrow\" | \"lp\" | \"staking\" | \"vault\";\n asset: string;\n amount: bigint;\n value_usd: number;\n}\n\nexport interface PortfolioPnL {\n period: string;\n start_value_usd: number;\n end_value_usd: number;\n pnl_usd: number;\n pnl_pct: number;\n token_changes: TokenChange[];\n}\n\nexport interface TokenChange {\n symbol: string;\n balance_change: bigint;\n value_change_usd: number;\n}\n","import type { Address } from \"viem\";\n\nexport type DefiErrorCode =\n | \"PROTOCOL_NOT_FOUND\"\n | \"TOKEN_NOT_FOUND\"\n | \"CHAIN_NOT_FOUND\"\n | \"INSUFFICIENT_BALANCE\"\n | \"INSUFFICIENT_ALLOWANCE\"\n | \"SLIPPAGE_EXCEEDED\"\n | \"SIMULATION_FAILED\"\n | \"ABI_ERROR\"\n | \"REGISTRY_ERROR\"\n | \"RPC_ERROR\"\n | \"PROVIDER_ERROR\"\n | \"CONTRACT_ERROR\"\n | \"INVALID_PARAM\"\n | \"UNSUPPORTED\"\n | \"TX_FAILED\"\n | \"INTERNAL\";\n\nexport class DefiError extends Error {\n readonly code: DefiErrorCode;\n\n constructor(code: DefiErrorCode, message: string) {\n super(message);\n this.name = \"DefiError\";\n this.code = code;\n }\n\n static protocolNotFound(name: string): DefiError {\n return new DefiError(\"PROTOCOL_NOT_FOUND\", `Protocol not found: ${name}`);\n }\n\n static tokenNotFound(name: string): DefiError {\n return new DefiError(\"TOKEN_NOT_FOUND\", `Token not found: ${name}`);\n }\n\n static chainNotFound(name: string): DefiError {\n return new DefiError(\"CHAIN_NOT_FOUND\", `Chain not found: ${name}`);\n }\n\n static insufficientBalance(needed: string, available: string): DefiError {\n return new DefiError(\n \"INSUFFICIENT_BALANCE\",\n `Insufficient balance: need ${needed}, have ${available}`,\n );\n }\n\n static insufficientAllowance(spender: Address): DefiError {\n return new DefiError(\n \"INSUFFICIENT_ALLOWANCE\",\n `Insufficient allowance for spender ${spender}`,\n );\n }\n\n static slippageExceeded(expected: string, actual: string): DefiError {\n return new DefiError(\n \"SLIPPAGE_EXCEEDED\",\n `Slippage exceeded: expected ${expected}, got ${actual}`,\n );\n }\n\n static simulationFailed(reason: string): DefiError {\n return new DefiError(\n \"SIMULATION_FAILED\",\n `Transaction simulation failed: ${reason}`,\n );\n }\n\n static abiError(reason: string): DefiError {\n return new DefiError(\"ABI_ERROR\", `ABI encoding error: ${reason}`);\n }\n\n static registryError(reason: string): DefiError {\n return new DefiError(\"REGISTRY_ERROR\", `Registry error: ${reason}`);\n }\n\n static rpcError(reason: string): DefiError {\n return new DefiError(\"RPC_ERROR\", `RPC error: ${reason}`);\n }\n\n static providerError(reason: string): DefiError {\n return new DefiError(\"PROVIDER_ERROR\", `Provider error: ${reason}`);\n }\n\n static contractError(reason: string): DefiError {\n return new DefiError(\"CONTRACT_ERROR\", `Contract error: ${reason}`);\n }\n\n static invalidParam(reason: string): DefiError {\n return new DefiError(\"INVALID_PARAM\", `Invalid parameter: ${reason}`);\n }\n\n static unsupported(operation: string): DefiError {\n return new DefiError(\n \"UNSUPPORTED\",\n `Unsupported operation: ${operation}`,\n );\n }\n\n static internal(reason: string): DefiError {\n return new DefiError(\"INTERNAL\", `Internal error: ${reason}`);\n }\n\n toJSON() {\n return { error: this.message };\n }\n}\n\nexport type Result<T> = T;\n","/**\n * BigInt JSON serialization utilities.\n *\n * Rust's alloy U256 (backed by ruint) serializes to JSON as 0x-prefixed\n * lowercase hex strings (e.g., \"0x75bcd15\"). We must match this exactly\n * for behavioral parity.\n */\n\n/** JSON replacer for Rust parity — bigint becomes 0x-hex string */\nexport function jsonReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return \"0x\" + value.toString(16);\n }\n return value;\n}\n\n/** JSON replacer for SDK consumers — bigint becomes decimal string */\nexport function jsonReplacerDecimal(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n\n/** Stringify with decimal bigint handling */\nexport function jsonStringify(data: unknown, pretty = true): string {\n return pretty\n ? JSON.stringify(data, jsonReplacerDecimal, 2)\n : JSON.stringify(data, jsonReplacerDecimal);\n}\n\n/** Parse a 0x-hex or decimal string to bigint */\nexport function parseBigInt(value: string): bigint {\n if (value.startsWith(\"0x\") || value.startsWith(\"0X\")) {\n return BigInt(value);\n }\n return BigInt(value);\n}\n","import type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseAbi } from \"viem\";\nimport type { DeFiTx } from \"./types.js\";\n\nconst erc20Abi = parseAbi([\n \"function name() view returns (string)\",\n \"function symbol() view returns (string)\",\n \"function decimals() view returns (uint8)\",\n \"function totalSupply() view returns (uint256)\",\n \"function balanceOf(address account) view returns (uint256)\",\n \"function transfer(address to, uint256 amount) returns (bool)\",\n \"function allowance(address owner, address spender) view returns (uint256)\",\n \"function approve(address spender, uint256 amount) returns (bool)\",\n \"function transferFrom(address from, address to, uint256 amount) returns (bool)\",\n]);\n\nexport { erc20Abi };\n\nexport function buildApprove(\n token: Address,\n spender: Address,\n amount: bigint,\n): DeFiTx {\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n });\n return {\n description: `Approve ${spender} to spend ${amount} of token ${token}`,\n to: token,\n data,\n value: 0n,\n gas_estimate: 60_000,\n };\n}\n\nexport function buildTransfer(\n token: Address,\n to: Address,\n amount: bigint,\n): DeFiTx {\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, amount],\n });\n return {\n description: `Transfer ${amount} of token ${token} to ${to}`,\n to: token,\n data,\n value: 0n,\n gas_estimate: 65_000,\n };\n}\n","import { createPublicClient, http, type PublicClient } from \"viem\";\n\nconst providerCache = new Map<string, PublicClient>();\n\nexport function getProvider(rpcUrl: string): PublicClient {\n const cached = providerCache.get(rpcUrl);\n if (cached) return cached;\n\n const client = createPublicClient({ transport: http(rpcUrl) });\n providerCache.set(rpcUrl, client);\n return client;\n}\n\nexport function clearProviderCache(): void {\n providerCache.clear();\n}\n","import type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, decodeFunctionResult, parseAbi } from \"viem\";\nimport type { DeFiTx } from \"./types.js\";\nimport { getProvider } from \"./provider.js\";\n\nexport const MULTICALL3_ADDRESS: Address =\n \"0xcA11bde05977b3631167028862bE2a173976CA11\";\n\nconst multicall3Abi = parseAbi([\n \"struct Call3 { address target; bool allowFailure; bytes callData; }\",\n \"struct Result { bool success; bytes returnData; }\",\n \"function aggregate3(Call3[] calls) returns (Result[] returnData)\",\n]);\n\nexport function buildMulticall(calls: Array<[Address, Hex]>): DeFiTx {\n const mcCalls = calls.map(([target, callData]) => ({\n target,\n allowFailure: true,\n callData,\n }));\n\n const data = encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [mcCalls],\n });\n\n return {\n description: `Multicall3 batch (${calls.length} calls)`,\n to: MULTICALL3_ADDRESS,\n data,\n value: 0n,\n };\n}\n\nexport async function multicallRead(\n rpcUrl: string,\n calls: Array<[Address, Hex]>,\n): Promise<(Hex | null)[]> {\n const client = getProvider(rpcUrl);\n\n const mcCalls = calls.map(([target, callData]) => ({\n target,\n allowFailure: true,\n callData,\n }));\n\n const result = await client.call({\n to: MULTICALL3_ADDRESS,\n data: encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [mcCalls],\n }),\n });\n\n if (!result.data) return calls.map(() => null);\n\n const decoded = decodeFunctionResult({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n data: result.data,\n }) as Array<{ success: boolean; returnData: Hex }>;\n\n return decoded.map((r) => (r.success ? r.returnData : null));\n}\n\nexport function decodeU256(data: Hex | null): bigint {\n if (!data || data.length < 66) return 0n;\n return BigInt(data.slice(0, 66));\n}\n\nexport function decodeU128(data: Hex | null): bigint {\n if (!data || data.length < 66) return 0n;\n const val = BigInt(data.slice(0, 66));\n return val & ((1n << 128n) - 1n);\n}\n","/**\n * Per-chain DEX aggregator slug map. Each entry is the chain identifier the\n * aggregator's API expects:\n * - For per-chain-named aggregators (KyberSwap, OpenOcean, LiquidSwap), this is the\n * chain slug (e.g., \"ethereum\", \"bsc\", \"base\").\n * - For chainId-based aggregators (LI.FI, Relay), use \"auto\" — the adapter falls\n * back to `chain_id` numeric.\n * - Omit a key to mark the aggregator as unsupported on that chain.\n */\nexport interface AggregatorSlugs {\n kyber?: string;\n openocean?: string;\n liquid?: string;\n lifi?: string;\n relay?: string;\n}\n\nexport class ChainConfig {\n name!: string;\n chain_id!: number;\n rpc_url!: string;\n explorer_url?: string;\n native_token!: string;\n wrapped_native?: string;\n multicall3?: string;\n aggregators?: AggregatorSlugs;\n\n effectiveRpcUrl(): string {\n const chainEnv = this.name.toUpperCase().replace(/ /g, \"_\") + \"_RPC_URL\";\n return (\n process.env[chainEnv] ??\n process.env[\"HYPEREVM_RPC_URL\"] ??\n this.rpc_url\n );\n }\n}\n","import type { Address } from \"viem\";\n\nexport enum ProtocolCategory {\n Dex = \"dex\",\n Lending = \"lending\",\n Cdp = \"cdp\",\n Bridge = \"bridge\",\n LiquidStaking = \"liquid_staking\",\n YieldSource = \"yield_source\",\n YieldAggregator = \"yield_aggregator\",\n Vault = \"vault\",\n Derivatives = \"derivatives\",\n Options = \"options\",\n LiquidityManager = \"liquidity_manager\",\n Nft = \"nft\",\n Other = \"other\",\n}\n\nexport function protocolCategoryLabel(category: ProtocolCategory): string {\n switch (category) {\n case ProtocolCategory.Dex:\n return \"DEX\";\n case ProtocolCategory.Lending:\n return \"Lending\";\n case ProtocolCategory.Cdp:\n return \"CDP\";\n case ProtocolCategory.Bridge:\n return \"Bridge\";\n case ProtocolCategory.LiquidStaking:\n return \"Liquid Staking\";\n case ProtocolCategory.YieldSource:\n return \"Yield Source\";\n case ProtocolCategory.YieldAggregator:\n return \"Yield Aggregator\";\n case ProtocolCategory.Vault:\n return \"Vault\";\n case ProtocolCategory.Derivatives:\n return \"Derivatives\";\n case ProtocolCategory.Options:\n return \"Options\";\n case ProtocolCategory.LiquidityManager:\n return \"Liquidity Manager\";\n case ProtocolCategory.Nft:\n return \"NFT\";\n case ProtocolCategory.Other:\n return \"Other\";\n }\n}\n\nexport interface PoolInfo {\n name: string;\n address: Address;\n token0: string;\n token1: string;\n tick_spacing?: number;\n gauge?: Address;\n stable?: boolean;\n}\n\n/** How rewards are read for this protocol — informs which adapter the gauge layer uses */\nexport type RewardStrategy =\n | \"on_chain_gauge\" // Solidly-style gauge.earned()\n | \"on_chain_gauge_tokenid\" // Hybra/Aerodrome CL: gauge.earned(tokenId) or earned(addr,tokenId)\n | \"on_chain_farming_center\" // Algebra eternal farming (KittenSwap)\n | \"on_chain_masterchef\" // MasterChef (PancakeSwap V3)\n | \"auto_stake\" // Ramses x(3,3) — emissions handled internally, no external claim\n | \"lp_fee_only\" // V3 swap-only fork — LP earns trading fees via NPM.collect, no emissions\n | \"off_chain_api\" // Nest — backend-signed claim tickets\n | \"none\"; // No rewards at all (very rare; usually use lp_fee_only for V3 forks)\n\n/** How native input (HYPE / ETH) is wrapped on this DEX (some forks use a non-standard pattern) */\nexport type NativeInputStyle = \"algebra-native\";\n\nexport interface ProtocolEntry {\n name: string;\n slug: string;\n category: ProtocolCategory;\n interface: string;\n chain: string;\n native?: boolean;\n /** Verified PASS via on-chain `cast call`. Setting to false hides the protocol (fail-closed). */\n verified?: boolean;\n /**\n * Whether this protocol should be exposed to runtime callers.\n * Defaults to true. Setting to false hides it from getProtocolsForChain()\n * even when verified=true (use this for protocols whose ABI/integration is incomplete).\n */\n is_active?: boolean;\n /** Non-standard native-input wrapping flow — only set when adapter needs special handling */\n native_input_style?: NativeInputStyle;\n /** How rewards are computed/claimed — drives reward strategy dispatch in factory.createGauge */\n reward_strategy?: RewardStrategy;\n /**\n * Concentrated-liquidity dialect for `interface = \"uniswap_v3\"` forks. Drives\n * adapter mint encoding & quoter selection.\n * - undefined: standard Uniswap V3 (uint24 fee in MintParams)\n * - \"slipstream\": Aerodrome/Velodrome Slipstream (int24 tickSpacing + sqrtPriceX96, 12-field MintParams)\n * - \"ramses\": Ramses CL x(3,3) (auto-stake, tickSpacing-based quoter, NPM.getPeriodReward claim)\n */\n cl_style?: \"slipstream\" | \"ramses\";\n contracts?: Record<string, Address>;\n pools?: PoolInfo[];\n description?: string;\n}\n","import { readFileSync, readdirSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse } from \"smol-toml\";\nimport { ChainConfig } from \"./chain.js\";\nimport type { TokenEntry } from \"./token.js\";\nimport { type ProtocolEntry, type PoolInfo, ProtocolCategory } from \"./protocol.js\";\n\nimport { existsSync } from \"fs\";\n\nconst __dirname = fileURLToPath(new URL(\".\", import.meta.url));\n\n// Resolve config dir: works from src/ (vitest), dist/ (built), and npm bundle (npx)\nfunction findConfigDir(): string {\n const candidates = [\n resolve(__dirname, \"../../../config\"), // from dist/registry/ (monorepo build)\n resolve(__dirname, \"../../../../config\"), // from src/registry/ (vitest)\n resolve(__dirname, \"../config\"), // from dist/ (npm bundle — config at package root)\n resolve(__dirname, \"../../config\"), // from dist/subdir (npm bundle variant)\n ];\n for (const dir of candidates) {\n if (existsSync(resolve(dir, \"chains.toml\"))) return dir;\n }\n throw new Error(`Config directory not found. Searched: ${candidates.join(\", \")}`);\n}\n\nconst CONFIG_DIR = findConfigDir();\n\nfunction readToml(relPath: string): string {\n return readFileSync(resolve(CONFIG_DIR, relPath), \"utf-8\");\n}\n\ninterface ChainConfigWrapper {\n chain: Record<string, ChainConfig>;\n}\n\ninterface TokensWrapper {\n token: TokenEntry[];\n}\n\ninterface ProtocolWrapper {\n protocol: ProtocolEntry;\n}\n\nexport class Registry {\n chains: Map<string, ChainConfig>;\n tokens: Map<string, TokenEntry[]>;\n protocols: ProtocolEntry[];\n\n private constructor(\n chains: Map<string, ChainConfig>,\n tokens: Map<string, TokenEntry[]>,\n protocols: ProtocolEntry[],\n ) {\n this.chains = chains;\n this.tokens = tokens;\n this.protocols = protocols;\n }\n\n static loadEmbedded(): Registry {\n const chains = Registry.loadChains();\n const tokens = Registry.loadTokens();\n const protocols = Registry.loadProtocols();\n return new Registry(chains, tokens, protocols);\n }\n\n private static loadChains(): Map<string, ChainConfig> {\n const raw = parse(readToml(\"chains.toml\")) as unknown as ChainConfigWrapper;\n const map = new Map<string, ChainConfig>();\n for (const [key, data] of Object.entries(raw.chain)) {\n const cfg = Object.assign(new ChainConfig(), data);\n map.set(key, cfg);\n }\n return map;\n }\n\n private static loadTokens(): Map<string, TokenEntry[]> {\n // Dynamically discover all token files in config/tokens/\n const map = new Map<string, TokenEntry[]>();\n const tokensDir = resolve(CONFIG_DIR, \"tokens\");\n try {\n const files = readdirSync(tokensDir).filter(f => f.endsWith(\".toml\"));\n for (const file of files) {\n const chain = file.replace(\".toml\", \"\");\n try {\n const raw = parse(readToml(`tokens/${file}`)) as unknown as TokensWrapper;\n map.set(chain, raw.token);\n } catch { /* skip invalid token files */ }\n }\n } catch { /* tokens dir may not exist */ }\n return map;\n }\n\n private static loadProtocols(): ProtocolEntry[] {\n // Dynamically discover all protocol TOML files across all categories\n const protocols: ProtocolEntry[] = [];\n const protocolsDir = resolve(CONFIG_DIR, \"protocols\");\n const categories = [\"dex\", \"lending\", \"cdp\", \"vault\", \"liquid_staking\", \"yield_aggregator\", \"yield_source\", \"derivatives\", \"options\", \"nft\", \"bridge\"];\n\n for (const category of categories) {\n const catDir = resolve(protocolsDir, category);\n try {\n if (!existsSync(catDir)) continue;\n const files = readdirSync(catDir).filter(f => f.endsWith(\".toml\"));\n for (const file of files) {\n try {\n const raw = parse(readToml(`protocols/${category}/${file}`)) as unknown as ProtocolWrapper;\n protocols.push(raw.protocol);\n } catch { /* skip invalid protocol files */ }\n }\n } catch { /* category dir may not exist */ }\n }\n return protocols;\n }\n\n getChain(name: string): ChainConfig {\n const chain = this.chains.get(name);\n if (!chain) throw new Error(`Chain not found: ${name}`);\n return chain;\n }\n\n getProtocol(name: string): ProtocolEntry {\n const protocol = this.protocols.find(\n (p) =>\n p.name.toLowerCase() === name.toLowerCase() ||\n p.slug.toLowerCase() === name.toLowerCase(),\n );\n if (!protocol) throw new Error(`Protocol not found: ${name}`);\n return protocol;\n }\n\n getProtocolsByCategory(category: ProtocolCategory): ProtocolEntry[] {\n return this.protocols.filter((p) => p.category === category);\n }\n\n getProtocolsForChain(chain: string, includeUnverified = false): ProtocolEntry[] {\n return this.protocols.filter(\n (p) =>\n p.chain.toLowerCase() === chain.toLowerCase() &&\n (includeUnverified || p.verified !== false) &&\n p.is_active !== false,\n );\n }\n\n resolveToken(chain: string, symbol: string): TokenEntry {\n const tokens = this.tokens.get(chain);\n if (!tokens) throw new Error(`Chain not found: ${chain}`);\n const token = tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n if (!token) throw new Error(`Token not found: ${symbol}`);\n return token;\n }\n\n /**\n * Resolve a pool by name (e.g. \"WHYPE/USDC\") from a protocol's pool list.\n * Returns the pool info or throws if not found.\n */\n resolvePool(protocolSlug: string, poolName: string): PoolInfo {\n const protocol = this.getProtocol(protocolSlug);\n if (!protocol.pools || protocol.pools.length === 0) {\n throw new Error(`Protocol ${protocol.name} has no pools configured`);\n }\n const pool = protocol.pools.find(\n (p) => p.name.toLowerCase() === poolName.toLowerCase(),\n );\n if (!pool) {\n const available = protocol.pools.map(p => p.name).join(\", \");\n throw new Error(`Pool '${poolName}' not found in ${protocol.name}. Available: ${available}`);\n }\n return pool;\n }\n}\n","import { DefiError } from \"@hypurrquant/defi-core\";\nimport type { ProtocolEntry } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\n\n// DEX adapters\nimport { UniswapV3Adapter } from \"./dex/uniswap_v3.js\";\nimport { UniswapV2Adapter } from \"./dex/uniswap_v2.js\";\nimport { AlgebraV3Adapter } from \"./dex/algebra_v3.js\";\nimport { BalancerV3Adapter } from \"./dex/balancer_v3.js\";\nimport { CurveStableSwapAdapter } from \"./dex/curve.js\";\nimport { SolidlyAdapter } from \"./dex/solidly.js\";\nimport { ThenaCLAdapter } from \"./dex/thena_cl.js\";\nimport { HybraGaugeAdapter } from \"./dex/hybra_gauge.js\";\nimport { WooFiAdapter } from \"./dex/woofi.js\";\nimport { SolidlyGaugeAdapter } from \"./dex/solidly_gauge.js\";\nimport { MasterChefAdapter } from \"./dex/masterchef.js\";\nimport { MerchantMoeLBAdapter } from \"./dex/merchant_moe_lb.js\";\nimport { KittenSwapFarmingAdapter } from \"./dex/kittenswap_farming.js\";\nimport { NestOffChainAdapter } from \"./dex/nest_offchain.js\";\n\n// Trait interfaces\nimport type { IDex } from \"@hypurrquant/defi-core\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport type { ICdp } from \"@hypurrquant/defi-core\";\nimport type { IVault } from \"@hypurrquant/defi-core\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport type { IGaugeSystem } from \"@hypurrquant/defi-core\";\nimport type { IGauge } from \"@hypurrquant/defi-core\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport type { IOptions } from \"@hypurrquant/defi-core\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport type { INft } from \"@hypurrquant/defi-core\";\n\n// Lending adapters\nimport { AaveV3Adapter } from \"./lending/aave_v3.js\";\nimport { AaveV2Adapter } from \"./lending/aave_v2.js\";\nimport { AaveOracleAdapter } from \"./lending/aave_oracle.js\";\nimport { CompoundV2Adapter } from \"./lending/compound_v2.js\";\nimport { CompoundV3Adapter } from \"./lending/compound_v3.js\";\nimport { EulerV2Adapter } from \"./lending/euler_v2.js\";\nimport { MorphoBlueAdapter } from \"./lending/morpho.js\";\n\n// CDP adapters\nimport { FelixCdpAdapter } from \"./cdp/felix.js\";\nimport { FelixOracleAdapter } from \"./cdp/felix_oracle.js\";\n\n// Vault adapters\nimport { ERC4626VaultAdapter } from \"./vault/erc4626.js\";\n\n// Liquid staking adapters\nimport { GenericLstAdapter } from \"./liquid_staking/generic_lst.js\";\nimport { StHypeAdapter } from \"./liquid_staking/sthype.js\";\nimport { KinetiqAdapter } from \"./liquid_staking/kinetiq.js\";\n\n// Yield source adapters\nimport { PendleAdapter } from \"./yield_source/pendle.js\";\nimport { GenericYieldAdapter } from \"./yield_source/generic_yield.js\";\n\n// Derivatives adapters\nimport { HlpVaultAdapter } from \"./derivatives/hlp.js\";\nimport { GenericDerivativesAdapter } from \"./derivatives/generic_derivatives.js\";\n\n// Options adapters\nimport { RyskAdapter } from \"./options/rysk.js\";\nimport { GenericOptionsAdapter } from \"./options/generic_options.js\";\n\n// NFT adapters\nimport { ERC721Adapter } from \"./nft/erc721.js\";\n\n// ============================================================\n// DEX\n// ============================================================\n\n/** Create a Dex implementation from a protocol registry entry */\nexport function createDex(entry: ProtocolEntry, rpcUrl?: string): IDex {\n switch (entry.interface) {\n case \"uniswap_v3\":\n return new UniswapV3Adapter(entry, rpcUrl);\n case \"uniswap_v4\":\n throw DefiError.unsupported(\n `[${entry.name}] Uniswap V4 (singleton PoolManager) is not yet supported — use HyperSwap V3 or another V3-compatible DEX for quotes`,\n );\n case \"algebra_v3\":\n return new AlgebraV3Adapter(entry, rpcUrl);\n case \"uniswap_v2\":\n return new UniswapV2Adapter(entry, rpcUrl);\n case \"solidly_v2\":\n case \"solidly_cl\":\n return new SolidlyAdapter(entry, rpcUrl);\n case \"hybra\":\n return new ThenaCLAdapter(entry, rpcUrl);\n case \"curve_stableswap\":\n return new CurveStableSwapAdapter(entry);\n case \"balancer_v3\":\n return new BalancerV3Adapter(entry);\n case \"woofi\":\n return new WooFiAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`DEX interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Lending\n// ============================================================\n\n/** Create a Lending implementation from a protocol registry entry */\nexport function createLending(entry: ProtocolEntry, rpcUrl?: string): ILending {\n switch (entry.interface) {\n case \"aave_v3\":\n case \"aave_v3_isolated\":\n return new AaveV3Adapter(entry, rpcUrl);\n case \"aave_v2\":\n return new AaveV2Adapter(entry, rpcUrl);\n case \"morpho_blue\":\n return new MorphoBlueAdapter(entry, rpcUrl);\n case \"euler_v2\":\n return new EulerV2Adapter(entry, rpcUrl);\n case \"compound_v2\":\n return new CompoundV2Adapter(entry, rpcUrl);\n case \"compound_v3\":\n return new CompoundV3Adapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Lending interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// CDP\n// ============================================================\n\n/** Create a CDP implementation from a protocol registry entry */\nexport function createCdp(entry: ProtocolEntry, rpcUrl?: string): ICdp {\n switch (entry.interface) {\n case \"liquity_v2\":\n return new FelixCdpAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`CDP interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Vault\n// ============================================================\n\n/** Create a Vault implementation from a protocol registry entry */\nexport function createVault(entry: ProtocolEntry, rpcUrl?: string): IVault {\n switch (entry.interface) {\n case \"erc4626\":\n case \"beefy_vault\":\n return new ERC4626VaultAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Vault interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Liquid Staking\n// ============================================================\n\n/** Create a LiquidStaking implementation from a protocol registry entry */\nexport function createLiquidStaking(entry: ProtocolEntry, rpcUrl?: string): ILiquidStaking {\n switch (entry.interface) {\n case \"kinetiq_staking\":\n return new KinetiqAdapter(entry, rpcUrl);\n case \"sthype_staking\":\n return new StHypeAdapter(entry, rpcUrl);\n case \"hyperbeat_lst\":\n case \"kintsu\":\n return new GenericLstAdapter(entry, rpcUrl);\n default:\n return new GenericLstAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Gauge\n// ============================================================\n\n/** Create a GaugeSystem implementation from a protocol registry entry */\nexport function createGauge(entry: ProtocolEntry, rpcUrl?: string, tokens?: Address[]): IGaugeSystem {\n // Hybra has its own GaugeManager system\n if (entry.interface === \"hybra\" || entry.contracts?.[\"gauge_manager\"]) {\n return new HybraGaugeAdapter(entry, rpcUrl);\n }\n switch (entry.interface) {\n case \"solidly_v2\":\n case \"solidly_cl\":\n case \"algebra_v3\":\n return new SolidlyGaugeAdapter(entry, rpcUrl, tokens);\n // uniswap_v3 with voter = ve(3,3) CL (e.g., Aerodrome Slipstream, Ramses CL)\n case \"uniswap_v3\":\n if (entry.contracts?.[\"voter\"]) return new SolidlyGaugeAdapter(entry, rpcUrl, tokens);\n throw DefiError.unsupported(`Gauge interface '${entry.interface}' not supported (no voter contract)`);\n default:\n throw DefiError.unsupported(`Gauge interface '${entry.interface}' not supported`);\n }\n}\n\n/** Create a MasterChef IGauge implementation from a protocol registry entry */\nexport function createMasterChef(entry: ProtocolEntry, rpcUrl?: string): IGauge {\n return new MasterChefAdapter(entry, rpcUrl);\n}\n\n// ============================================================\n// Yield Source (fallback to GenericYield)\n// ============================================================\n\n/** Create a YieldSource implementation — falls back to GenericYield for unknown interfaces */\nexport function createYieldSource(entry: ProtocolEntry, rpcUrl?: string): IYieldSource {\n switch (entry.interface) {\n case \"pendle_v2\":\n return new PendleAdapter(entry, rpcUrl);\n default:\n return new GenericYieldAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Derivatives (fallback to GenericDerivatives)\n// ============================================================\n\n/** Create a Derivatives implementation — falls back to GenericDerivatives for unknown interfaces */\nexport function createDerivatives(entry: ProtocolEntry, rpcUrl?: string): IDerivatives {\n switch (entry.interface) {\n case \"hlp_vault\":\n return new HlpVaultAdapter(entry, rpcUrl);\n default:\n return new GenericDerivativesAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Options (fallback to GenericOptions)\n// ============================================================\n\n/** Create an Options implementation — falls back to GenericOptions for unknown interfaces */\nexport function createOptions(entry: ProtocolEntry, rpcUrl?: string): IOptions {\n switch (entry.interface) {\n case \"rysk\":\n return new RyskAdapter(entry, rpcUrl);\n default:\n return new GenericOptionsAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// NFT\n// ============================================================\n\n/** Create an NFT implementation from a protocol registry entry */\nexport function createNft(entry: ProtocolEntry, rpcUrl?: string): INft {\n switch (entry.interface) {\n case \"erc721\":\n return new ERC721Adapter(entry, rpcUrl);\n case \"marketplace\":\n throw DefiError.unsupported(`NFT marketplace '${entry.name}' is not queryable as ERC-721. Use a specific collection address.`);\n default:\n throw DefiError.unsupported(`NFT interface '${entry.interface}' not supported`);\n }\n}\n\n// ============================================================\n// Oracle from Lending\n// ============================================================\n\n/** Create an Oracle from a lending protocol entry (Aave V3 forks have an oracle contract) */\nexport function createOracleFromLending(entry: ProtocolEntry, rpcUrl: string): IOracle {\n switch (entry.interface) {\n case \"aave_v3\":\n case \"aave_v3_isolated\":\n return new AaveOracleAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Oracle not available for lending interface '${entry.interface}'`);\n }\n}\n\n// ============================================================\n// Oracle from CDP\n// ============================================================\n\n/** Create an Oracle from a CDP protocol entry (Felix has its own PriceFeed contract) */\nexport function createOracleFromCdp(entry: ProtocolEntry, _asset: Address, rpcUrl: string): IOracle {\n switch (entry.interface) {\n case \"liquity_v2\":\n return new FelixOracleAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Oracle not available for CDP interface '${entry.interface}'`);\n }\n}\n\n// ============================================================\n// Merchant Moe LB\n// ============================================================\n\n/** Create a MerchantMoeLBAdapter for Liquidity Book operations */\nexport function createMerchantMoeLB(entry: ProtocolEntry, rpcUrl?: string): MerchantMoeLBAdapter {\n return new MerchantMoeLBAdapter(entry, rpcUrl);\n}\n\n// ============================================================\n// KittenSwap Algebra Farming\n// ============================================================\n\n// ============================================================\n// Nest Off-Chain (NEST emissions are NOT readable on-chain — backend-signed claim tickets)\n// ============================================================\n\n/** Create a NestOffChainAdapter for Nest reward queries via blaze.nest.aegas.it / usenest.xyz */\nexport function createNestOffChain(entry: ProtocolEntry): NestOffChainAdapter {\n return new NestOffChainAdapter(entry);\n}\n\n// ============================================================\n// Reward Reader — unified strategy dispatch\n// (mirrors HypurrQuant_FE packages/core/defi/lp/incentive/query/resolve.ts)\n// ============================================================\n\n/**\n * Discriminated union returned by createRewardReader. Callers narrow on `kind`\n * to access the strategy-specific adapter API.\n *\n * - off_chain_api → Nest backend-signed tickets (NestOffChainAdapter)\n * - on_chain_farming_center → Algebra Integral eternal farming (KittenSwap)\n * - on_chain_gauge_tokenid → gauge.earned(tokenId) per CL position (Hybra)\n * - on_chain_gauge → Solidly-style gauge.earned(addr) (Aerodrome V2, Thena V1)\n * - auto_stake → Ramses x(3,3): no external claim needed\n * - on_chain_masterchef → MasterChef pid→pending (PancakeSwap V3)\n * - none → Swap-only DEX, no rewards\n */\nexport type RewardReader =\n | { kind: \"off_chain_api\"; adapter: NestOffChainAdapter }\n | { kind: \"on_chain_farming_center\"; adapter: KittenSwapFarmingAdapter }\n | { kind: \"on_chain_gauge_tokenid\"; adapter: HybraGaugeAdapter }\n | { kind: \"on_chain_gauge\"; adapter: SolidlyGaugeAdapter }\n | { kind: \"auto_stake\"; adapter: SolidlyGaugeAdapter }\n | { kind: \"on_chain_masterchef\"; adapter: MasterChefAdapter }\n | { kind: \"none\" };\n\n/**\n * Build a strategy-aware reward reader for the given protocol entry.\n *\n * Reads `entry.reward_strategy` first (set in the protocol TOML). When the\n * field is missing (legacy entries), falls back to inferring from the\n * adapter `interface` and contract presence, mirroring the previous\n * implicit dispatch in createGauge.\n */\nexport function createRewardReader(\n entry: ProtocolEntry,\n rpcUrl?: string,\n tokens?: Address[],\n): RewardReader {\n const strategy = entry.reward_strategy ?? inferRewardStrategy(entry);\n\n switch (strategy) {\n case \"off_chain_api\":\n return { kind: \"off_chain_api\", adapter: new NestOffChainAdapter(entry) };\n\n case \"on_chain_farming_center\":\n if (!rpcUrl) throw DefiError.invalidParam(\"createRewardReader: rpcUrl required for on_chain_farming_center\");\n return { kind: \"on_chain_farming_center\", adapter: createKittenSwapFarming(entry, rpcUrl) };\n\n case \"on_chain_gauge_tokenid\":\n return { kind: \"on_chain_gauge_tokenid\", adapter: new HybraGaugeAdapter(entry, rpcUrl) };\n\n case \"on_chain_gauge\":\n return { kind: \"on_chain_gauge\", adapter: new SolidlyGaugeAdapter(entry, rpcUrl, tokens) };\n\n case \"auto_stake\":\n // Same adapter shape (Solidly), but caller is expected to recognize that\n // emissions accrue internally — no buildClaimRewards/getReward call needed.\n return { kind: \"auto_stake\", adapter: new SolidlyGaugeAdapter(entry, rpcUrl, tokens) };\n\n case \"on_chain_masterchef\":\n return { kind: \"on_chain_masterchef\", adapter: new MasterChefAdapter(entry, rpcUrl) };\n\n case \"none\":\n return { kind: \"none\" };\n\n default:\n throw DefiError.unsupported(`Unknown reward_strategy '${strategy}' on '${entry.slug}'`);\n }\n}\n\nfunction inferRewardStrategy(entry: ProtocolEntry): NonNullable<ProtocolEntry[\"reward_strategy\"]> {\n // Hybra has its own GaugeManager system → tokenid-keyed earned()\n if (entry.interface === \"hybra\" || entry.contracts?.[\"gauge_manager\"]) {\n return \"on_chain_gauge_tokenid\";\n }\n // Algebra eternal farming requires farming_center + eternal_farming\n if (entry.contracts?.[\"farming_center\"] && entry.contracts?.[\"eternal_farming\"]) {\n return \"on_chain_farming_center\";\n }\n // ve(3,3) gauges via voter\n if (entry.contracts?.[\"voter\"]) {\n return \"on_chain_gauge\";\n }\n // MasterChef\n if (entry.contracts?.[\"master_chef\"] || entry.contracts?.[\"masterChef\"]) {\n return \"on_chain_masterchef\";\n }\n return \"none\";\n}\n\n/** Create a KittenSwapFarmingAdapter for Algebra eternal farming operations */\nexport function createKittenSwapFarming(entry: ProtocolEntry, rpcUrl: string): KittenSwapFarmingAdapter {\n const farmingCenter = entry.contracts?.[\"farming_center\"];\n if (!farmingCenter) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${entry.name}] Missing 'farming_center' contract address`);\n }\n const eternalFarming = entry.contracts?.[\"eternal_farming\"];\n if (!eternalFarming) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${entry.name}] Missing 'eternal_farming' contract address`);\n }\n const positionManager = entry.contracts?.[\"position_manager\"];\n if (!positionManager) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${entry.name}] Missing 'position_manager' contract address`);\n }\n const factory = entry.contracts?.[\"factory\"] as Address | undefined;\n const rewardToken = entry.contracts?.[\"reward_token\"] as Address | undefined;\n const bonusRewardToken = entry.contracts?.[\"bonus_reward_token\"] as Address | undefined;\n return new KittenSwapFarmingAdapter(entry.name, farmingCenter, eternalFarming, positionManager, rpcUrl, factory, rewardToken, bonusRewardToken);\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst DEFAULT_FEE = 3000;\n\nconst swapRouterAbi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\nconst quoterAbi = parseAbi([\n \"struct QuoteExactInputSingleParams { address tokenIn; address tokenOut; uint256 amountIn; uint24 fee; uint160 sqrtPriceLimitX96; }\",\n \"function quoteExactInputSingle(QuoteExactInputSingleParams memory params) external returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)\",\n]);\n\n// Ramses CL uses tickSpacing instead of fee in the quoter struct\nconst ramsesQuoterAbi = parseAbi([\n \"struct QuoteExactInputSingleParams { address tokenIn; address tokenOut; uint256 amountIn; int24 tickSpacing; uint160 sqrtPriceLimitX96; }\",\n \"function quoteExactInputSingle(QuoteExactInputSingleParams memory params) external returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)\",\n]);\n\nconst positionManagerAbi = parseAbi([\n \"struct MintParams { address token0; address token1; uint24 fee; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n \"struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; }\",\n \"function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; }\",\n \"function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"struct IncreaseLiquidityParams { uint256 tokenId; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; uint256 deadline; }\",\n \"function increaseLiquidity(IncreaseLiquidityParams calldata params) external payable returns (uint128 liquidity, uint256 amount0, uint256 amount1)\",\n \"function positions(uint256 tokenId) external view returns (uint96 nonce, address operator, address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1)\",\n \"function multicall(bytes[] data) external payable returns (bytes[] memory results)\",\n]);\n\n// Aerodrome Slipstream / Velodrome CL NPM mint — adds int24 tickSpacing (replaces fee)\n// AND uint160 sqrtPriceX96 (12th field) for pool initialization on-the-fly.\nconst slipstreamMintAbi = parseAbi([\n \"struct SlipstreamMintParams { address token0; address token1; int24 tickSpacing; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; uint160 sqrtPriceX96; }\",\n \"function mint(SlipstreamMintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\nexport class UniswapV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly quoter: Address | undefined;\n private readonly positionManager: Address | undefined;\n private readonly factory: Address | undefined;\n private readonly fee: number;\n private readonly rpcUrl: string | undefined;\n private readonly useTickSpacingQuoter: boolean;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.quoter = entry.contracts?.[\"quoter\"];\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.factory = entry.contracts?.[\"factory\"];\n this.fee = DEFAULT_FEE;\n this.rpcUrl = rpcUrl;\n // CL dialect: Slipstream/Ramses use tickSpacing in MintParams instead of fee.\n // Prefer explicit `cl_style` config over the legacy heuristic of pool_deployer/gauge_factory.\n this.useTickSpacingQuoter = entry.cl_style === \"slipstream\"\n || entry.cl_style === \"ramses\"\n || entry.contracts?.[\"pool_deployer\"] !== undefined\n || entry.contracts?.[\"gauge_factory\"] !== undefined;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const amountOutMinimum = 0n;\n\n const data = encodeFunctionData({\n abi: swapRouterAbi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n fee: this.fee,\n recipient: params.recipient,\n deadline,\n amountIn: params.amount_in,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokenIn for tokenOut`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n\n if (this.quoter) {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // Try tickSpacing-based quoter first for Ramses CL and similar forks\n if (this.useTickSpacingQuoter) {\n const tickSpacings = [1, 10, 50, 100, 200];\n const tsResults = await Promise.allSettled(\n tickSpacings.map(async (ts) => {\n const result = await client.call({\n to: this.quoter!,\n data: encodeFunctionData({\n abi: ramsesQuoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n tickSpacing: ts,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n });\n if (!result.data) return { amountOut: 0n, tickSpacing: ts };\n const [amountOut] = decodeAbiParameters(\n [{ name: \"amountOut\", type: \"uint256\" }],\n result.data,\n );\n return { amountOut, tickSpacing: ts };\n }),\n );\n\n let best = { amountOut: 0n, tickSpacing: 50 };\n for (const r of tsResults) {\n if (r.status === \"fulfilled\" && r.value.amountOut > best.amountOut) {\n best = r.value;\n }\n }\n\n if (best.amountOut > 0n) {\n return {\n protocol: this.protocolName,\n amount_out: best.amountOut,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [`${params.token_in} -> ${params.token_out} (tickSpacing: ${best.tickSpacing})`],\n };\n }\n\n // tickSpacing-based protocol (Ramses CL): quoter returned no result.\n // Pool exists but has no liquidity in this fork snapshot.\n throw DefiError.rpcError(\n `[${this.protocolName}] No quote available — pool exists but has zero liquidity for this pair`,\n );\n }\n\n // Standard Uniswap V3 fee-based quoter\n const feeTiers = [500, 3000, 10000, 100];\n const results = await Promise.allSettled(\n feeTiers.map(async (fee) => {\n const result = await client.call({\n to: this.quoter!,\n data: encodeFunctionData({\n abi: quoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n fee,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n });\n if (!result.data) return { amountOut: 0n, fee };\n const [amountOut] = decodeAbiParameters(\n [{ name: \"amountOut\", type: \"uint256\" }],\n result.data,\n );\n return { amountOut, fee };\n }),\n );\n\n let best = { amountOut: 0n, fee: 3000 };\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value.amountOut > best.amountOut) {\n best = r.value;\n }\n }\n\n if (best.amountOut > 0n) {\n return {\n protocol: this.protocolName,\n amount_out: best.amountOut,\n price_impact_bps: undefined,\n fee_bps: Math.floor(best.fee / 10),\n route: [`${params.token_in} -> ${params.token_out} (fee: ${best.fee})`],\n };\n }\n }\n\n // Fallback: simulate swap via eth_call on the router\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const callData = encodeFunctionData({\n abi: swapRouterAbi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n fee: this.fee,\n recipient: \"0x0000000000000000000000000000000000000001\",\n deadline: BigInt(\"18446744073709551615\"),\n amountIn: params.amount_in,\n amountOutMinimum: 0n,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n let output: `0x${string}` | undefined;\n try {\n const result = await client.call({ to: this.router, data: callData });\n output = result.data;\n } catch (e: unknown) {\n const errMsg = String(e);\n if (errMsg.includes(\"STF\") || errMsg.includes(\"insufficient\")) {\n throw DefiError.unsupported(\n `[${this.protocolName}] quote unavailable — no quoter contract configured. Swap simulation requires token balance. Add a quoter address to the protocol config.`,\n );\n }\n throw DefiError.rpcError(`[${this.protocolName}] swap simulation for quote failed: ${errMsg}`);\n }\n\n const amountOut =\n output && output.length >= 66\n ? BigInt(output.slice(0, 66))\n : 0n;\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: Math.floor(this.fee / 10),\n route: [`${params.token_in} -> ${params.token_out} (simulated)`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Position manager address not configured\");\n }\n\n // Sort tokens (Uniswap V3 requires token0 < token1)\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n // V3 NPM mint: getLiquidityForAmounts uses min(L0, L1), so if either is 0\n // then liquidity=0 → revert. Use 1 wei minimum for single-side LP.\n const amount0 = rawAmount0 === 0n && rawAmount1 > 0n ? 1n : rawAmount0;\n const amount1 = rawAmount1 === 0n && rawAmount0 > 0n ? 1n : rawAmount1;\n\n // Default: full range, configured fee tier\n let thirdField: number = this.fee;\n let tickLower = -887220;\n let tickUpper = 887220;\n\n // When --pool provided + RPC, read pool's actual tickSpacing/fee + current tick.\n // For Slipstream-style forks (useTickSpacingQuoter=true), MintParams' third field is tickSpacing, not fee.\n if (params.pool && this.rpcUrl) {\n const poolAbi = parseAbi([\n \"function fee() view returns (uint24)\",\n \"function tickSpacing() view returns (int24)\",\n \"function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16, uint16, uint16, bool)\",\n ]);\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const [poolFee, poolTs, slot0] = await Promise.all([\n client.readContract({ address: params.pool, abi: poolAbi, functionName: \"fee\" }).catch(() => null) as Promise<number | null>,\n client.readContract({ address: params.pool, abi: poolAbi, functionName: \"tickSpacing\" }).catch(() => null) as Promise<number | null>,\n client.readContract({ address: params.pool, abi: poolAbi, functionName: \"slot0\" }).catch(() => null) as Promise<readonly [bigint, number, number, number, number, boolean] | null>,\n ]);\n if (this.useTickSpacingQuoter && poolTs !== null) {\n thirdField = poolTs;\n } else if (poolFee !== null) {\n thirdField = poolFee;\n }\n // Compute concentrated range from --range_pct\n if (params.range_pct !== undefined && slot0 && poolTs !== null) {\n const currentTick = slot0[1];\n // Approximation: 1 tick ≈ 0.01% (1.0001x). ±N% → ±N*100 ticks.\n const rangeTicks = Math.floor(params.range_pct * 100);\n tickLower = Math.floor((currentTick - rangeTicks) / poolTs) * poolTs;\n tickUpper = Math.ceil((currentTick + rangeTicks) / poolTs) * poolTs;\n }\n }\n // Explicit overrides\n if (params.tick_lower !== undefined) tickLower = params.tick_lower;\n if (params.tick_upper !== undefined) tickUpper = params.tick_upper;\n\n const data = this.useTickSpacingQuoter\n ? encodeFunctionData({\n abi: slipstreamMintAbi,\n functionName: \"mint\",\n args: [\n {\n token0,\n token1,\n tickSpacing: thirdField,\n tickLower,\n tickUpper,\n amount0Desired: amount0,\n amount1Desired: amount1,\n amount0Min: 0n,\n amount1Min: 0n,\n recipient: params.recipient,\n deadline: BigInt(\"18446744073709551615\"),\n sqrtPriceX96: 0n,\n },\n ],\n })\n : encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"mint\",\n args: [\n {\n token0,\n token1,\n fee: thirdField,\n tickLower,\n tickUpper,\n amount0Desired: amount0,\n amount1Desired: amount1,\n amount0Min: 0n,\n amount1Min: 0n,\n recipient: params.recipient,\n deadline: BigInt(\"18446744073709551615\"),\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 500_000,\n approvals: [\n { token: token0, spender: pm, amount: amount0 },\n { token: token1, spender: pm, amount: amount1 },\n ],\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw DefiError.contractError(\n `[${this.protocolName}] Missing 'position_manager' for liquidity removal`,\n );\n }\n if (!params.token_id) {\n throw DefiError.invalidParam(\n `[${this.protocolName}] V3 remove_liquidity requires --token-id (NFT positionId)`,\n );\n }\n const tokenId = params.token_id;\n const liquidity = params.liquidity;\n const MAX_UINT128 = (1n << 128n) - 1n;\n const deadline = BigInt(\"18446744073709551615\");\n const decreaseData = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"decreaseLiquidity\",\n args: [{ tokenId, liquidity, amount0Min: 0n, amount1Min: 0n, deadline }],\n });\n const collectData = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"collect\",\n args: [{ tokenId, recipient: params.recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n });\n const data = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"multicall\",\n args: [[decreaseData, collectData]],\n });\n return {\n description: `[${this.protocolName}] Remove ${liquidity} liquidity from tokenId ${tokenId}`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n /**\n * Collect accrued LP trading fees for a CL position via NPM.collect().\n * Used as the reward path for V3 forks with reward_strategy = \"lp_fee_only\"\n * (e.g., HyperSwap V3, Project X — no gauge/emissions, fees are the only reward).\n */\n async buildCollectFees(tokenId: bigint, recipient: Address): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw DefiError.contractError(\n `[${this.protocolName}] Missing 'position_manager' for fee collection`,\n );\n }\n const MAX_UINT128 = (1n << 128n) - 1n;\n const data = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"collect\",\n args: [{ tokenId, recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n });\n return {\n description: `[${this.protocolName}] Collect LP fees for tokenId ${tokenId}`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Compound: collect accrued fees and immediately re-add them as liquidity to the same position.\n * Flow: static-call collect to learn fee amounts → multicall([collect, increaseLiquidity]) on NPM.\n * Requires existing token approvals on the NPM (set during initial mint).\n * v1: V3 fee-only protocols (Project X, HyperSwap V3). Gauge protocols need swap routing first.\n */\n async buildCompound(tokenId: bigint, recipient: Address, opts?: { slippageBps?: number }): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw DefiError.contractError(`[${this.protocolName}] Missing 'position_manager' for compound`);\n }\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC required to preview fees\");\n const MAX_UINT128 = (1n << 128n) - 1n;\n const deadline = BigInt(\"18446744073709551615\");\n const slippageBps = BigInt(opts?.slippageBps ?? 50); // default 0.5%\n if (slippageBps > 10000n) {\n throw DefiError.invalidParam(`[${this.protocolName}] slippageBps must be <= 10000 (got ${slippageBps})`);\n }\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const sim = await client.simulateContract({\n address: pm,\n abi: positionManagerAbi,\n functionName: \"collect\",\n args: [{ tokenId, recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n account: recipient,\n });\n const [amount0, amount1] = sim.result as readonly [bigint, bigint];\n if (amount0 === 0n && amount1 === 0n) {\n throw DefiError.invalidParam(`[${this.protocolName}] No fees to compound for tokenId ${tokenId}`);\n }\n const amount0Min = (amount0 * (10000n - slippageBps)) / 10000n;\n const amount1Min = (amount1 * (10000n - slippageBps)) / 10000n;\n const collectData = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"collect\",\n args: [{ tokenId, recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n });\n const increaseData = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"increaseLiquidity\",\n args: [{ tokenId, amount0Desired: amount0, amount1Desired: amount1, amount0Min, amount1Min, deadline }],\n });\n const data = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"multicall\",\n args: [[collectData, increaseData]],\n });\n return {\n description: `[${this.protocolName}] Compound tokenId ${tokenId}: collect ${amount0}/${amount1} → increaseLiquidity (slippage ${slippageBps}bps)`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 500_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeFunctionResult, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts)\",\n \"function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity)\",\n \"function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB)\",\n \"function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts)\",\n]);\n\nconst lbQuoterAbi = parseAbi([\n \"function findBestPathFromAmountIn(address[] calldata route, uint128 amountIn) external view returns ((address[] route, address[] pairs, uint256[] binSteps, uint256[] versions, uint128[] amounts, uint128[] virtualAmountsWithoutSlippage, uint128[] fees))\",\n]);\n\nexport class UniswapV2Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly rpcUrl: string | undefined;\n private readonly lbQuoter: Address | undefined;\n private readonly lbIntermediaries: Address[];\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.lbQuoter = entry.contracts?.[\"lb_quoter\"];\n this.rpcUrl = rpcUrl;\n\n // Collect LB intermediary tokens from contracts with \"lb_mid_\" prefix\n this.lbIntermediaries = [];\n if (entry.contracts) {\n for (const [key, addr] of Object.entries(entry.contracts)) {\n if (key.startsWith(\"lb_mid_\")) {\n this.lbIntermediaries.push(addr);\n }\n }\n }\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const amountOutMin = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const path: Address[] = [params.token_in, params.token_out];\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swapExactTokensForTokens\",\n args: [params.amount_in, amountOutMin, path, params.recipient, deadline],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokens via V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 150_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n\n // Try LB (Liquidity Book) quote first if lb_quoter is configured\n if (this.lbQuoter) {\n try {\n return await this.lbQuote(params);\n } catch {\n // Fall through to V2 quote\n }\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const path: Address[] = [params.token_in, params.token_out];\n\n const result = await client.call({\n to: this.router,\n data: encodeFunctionData({\n abi,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, path],\n }),\n });\n\n if (!result.data) {\n throw DefiError.rpcError(`[${this.protocolName}] getAmountsOut returned no data`);\n }\n\n const decoded = decodeFunctionResult({\n abi,\n functionName: \"getAmountsOut\",\n data: result.data,\n }) as unknown as bigint[];\n\n const amountOut = decoded[decoded.length - 1];\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: 30,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n private async lbQuote(params: QuoteParams): Promise<QuoteResult> {\n const client = createPublicClient({ transport: http(this.rpcUrl!) });\n\n // Build candidate routes: direct + multi-hop through each intermediary\n const routes: Address[][] = [[params.token_in, params.token_out]];\n const tokenInLower = params.token_in.toLowerCase();\n const tokenOutLower = params.token_out.toLowerCase();\n for (const mid of this.lbIntermediaries) {\n if (mid.toLowerCase() !== tokenInLower && mid.toLowerCase() !== tokenOutLower) {\n routes.push([params.token_in, mid, params.token_out]);\n }\n }\n\n const lbResultParams = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"route\", type: \"address[]\" as const },\n { name: \"pairs\", type: \"address[]\" as const },\n { name: \"binSteps\", type: \"uint256[]\" as const },\n { name: \"versions\", type: \"uint256[]\" as const },\n { name: \"amounts\", type: \"uint128[]\" as const },\n { name: \"virtualAmountsWithoutSlippage\", type: \"uint128[]\" as const },\n { name: \"fees\", type: \"uint128[]\" as const },\n ],\n },\n ] as const;\n\n let bestOut = 0n;\n let bestRoute: Address[] = [];\n\n const results = await Promise.allSettled(\n routes.map(async (route) => {\n const result = await client.call({\n to: this.lbQuoter!,\n data: encodeFunctionData({\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [route, params.amount_in],\n }),\n });\n if (!result.data) return { amountOut: 0n, route };\n const [quote] = decodeAbiParameters(lbResultParams, result.data);\n const amounts = quote.amounts;\n return { amountOut: amounts[amounts.length - 1], route };\n }),\n );\n\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value.amountOut > bestOut) {\n bestOut = r.value.amountOut;\n bestRoute = r.value.route;\n }\n }\n\n if (bestOut === 0n) {\n throw DefiError.rpcError(`[${this.protocolName}] LB quote returned zero for all routes`);\n }\n\n return {\n protocol: this.protocolName,\n amount_out: bestOut,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [bestRoute.map((a) => a.slice(0, 10)).join(\" -> \") + \" (LB)\"],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"addLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n params.amount_a,\n params.amount_b,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [\n { token: params.token_a, spender: this.router, amount: params.amount_a },\n { token: params.token_b, spender: this.router, amount: params.amount_b },\n ],\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"removeLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n params.liquidity,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Remove liquidity V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeAbiParameters, concatHex, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport { rangeToTicks, alignTickUp, alignTickDown } from \"./tick_math.js\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 limitSqrtPrice; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\n// Algebra Integral quoter: path = tokenIn(20) + deployer(20) + tokenOut(20) per hop\n// Returns arrays for multi-hop results\nconst algebraQuoterAbi = parseAbi([\n \"function quoteExactInput(bytes memory path, uint256 amountIn) external returns (uint256[] memory amountOutList, uint256[] memory amountInList, uint160[] memory sqrtPriceX96AfterList, uint32[] memory initializedTicksCrossedList, uint256 gasEstimate, uint16[] memory feeList)\",\n]);\n\n// Algebra V2 / NEST-style quoter: single-hop struct\n// selector: 0x5e5e6e0f quoteExactInputSingle((address,address,uint256,uint160))\n// returns: (uint256 amountOut, uint256 amountIn, uint160 sqrtPriceX96After)\nconst algebraSingleQuoterAbi = parseAbi([\n \"function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint160 limitSqrtPrice) params) external returns (uint256 amountOut, uint256 amountIn, uint160 sqrtPriceX96After)\",\n]);\n\n// Algebra Integral NonfungiblePositionManager (includes deployer field for pool identification)\nconst algebraIntegralPmAbi = parseAbi([\n \"struct MintParams { address token0; address token1; address deployer; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\n// Algebra V2 / NEST-style NonfungiblePositionManager (no deployer field)\nconst algebraV2PmAbi = parseAbi([\n \"struct MintParams { address token0; address token1; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\n// Standard V3 NPM methods shared across Algebra Integral and V2 (decrease + collect + multicall)\nconst algebraSharedPmAbi = parseAbi([\n \"struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; }\",\n \"function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; }\",\n \"function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"function multicall(bytes[] data) external payable returns (bytes[] memory results)\",\n]);\n\nexport class AlgebraV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly quoter: Address | undefined;\n private readonly positionManager: Address | undefined;\n private readonly rpcUrl: string | undefined;\n // NEST and similar forks expose quoteExactInputSingle((address,address,uint256,uint160))\n // instead of path-based quoteExactInput. Detected by presence of pool_deployer in config.\n private readonly useSingleQuoter: boolean;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.quoter = entry.contracts?.[\"quoter\"];\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.rpcUrl = rpcUrl;\n // pool_deployer present → NEST-style single-hop struct quoter\n this.useSingleQuoter = entry.contracts?.[\"pool_deployer\"] !== undefined;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const amountOutMinimum = 0n;\n\n const data = encodeFunctionData({\n abi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n recipient: params.recipient,\n deadline,\n amountIn: params.amount_in,\n amountOutMinimum,\n limitSqrtPrice: 0n,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokenIn for tokenOut`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 250_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n if (!this.quoter) {\n throw DefiError.unsupported(\n `[${this.protocolName}] No quoter contract configured`,\n );\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // NEST and similar forks: use single-hop struct quoter\n if (this.useSingleQuoter) {\n const result = await client.call({\n to: this.quoter,\n data: encodeFunctionData({\n abi: algebraSingleQuoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n limitSqrtPrice: 0n,\n },\n ],\n }),\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] quoteExactInputSingle failed: ${e}`);\n });\n\n if (!result.data || result.data.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] quoter returned empty data`);\n }\n\n const [amountOut] = decodeAbiParameters(\n [\n { name: \"amountOut\", type: \"uint256\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"sqrtPriceX96After\", type: \"uint160\" },\n ],\n result.data,\n );\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut as bigint,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n // KittenSwap and standard Algebra Integral path: tokenIn(20) + deployer(20) + tokenOut(20) = 60 bytes\n // Standard pools use deployer=address(0) in path (CREATE2 salt without deployer prefix)\n const path = concatHex([params.token_in, zeroAddress as Address, params.token_out]);\n\n const result = await client.call({\n to: this.quoter,\n data: encodeFunctionData({\n abi: algebraQuoterAbi,\n functionName: \"quoteExactInput\",\n args: [path, params.amount_in],\n }),\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] quoteExactInput failed: ${e}`);\n });\n\n if (!result.data || result.data.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] quoter returned empty data`);\n }\n\n // Decode first element: amountOutList is an array, take the last element\n const decoded = decodeAbiParameters(\n [\n { name: \"amountOutList\", type: \"uint256[]\" },\n { name: \"amountInList\", type: \"uint256[]\" },\n { name: \"sqrtPriceX96AfterList\", type: \"uint160[]\" },\n { name: \"initializedTicksCrossedList\", type: \"uint32[]\" },\n { name: \"gasEstimate\", type: \"uint256\" },\n { name: \"feeList\", type: \"uint16[]\" },\n ],\n result.data,\n );\n\n const amountOutList = decoded[0] as readonly bigint[];\n const feeList = decoded[5] as readonly number[];\n const amountOut = amountOutList[amountOutList.length - 1];\n const fee = feeList.length > 0 ? feeList[0] : undefined;\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: fee !== undefined ? Math.floor(fee / 10) : undefined,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Position manager address not configured\");\n }\n\n // Sort tokens (Algebra requires token0 < token1)\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n let tickLower = params.tick_lower ?? -887220;\n let tickUpper = params.tick_upper ?? 887220;\n\n // Auto tick detection: --range N% or single-side\n const isSingleSide = rawAmount0 === 0n || rawAmount1 === 0n;\n const needsAutoTick = (params.range_pct !== undefined) || (isSingleSide && !params.tick_lower && !params.tick_upper);\n\n if (needsAutoTick) {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for auto tick detection\");\n const poolAddr = params.pool as Address | undefined;\n if (!poolAddr) throw new DefiError(\"CONTRACT_ERROR\", \"Pool address required (use --pool)\");\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const algebraPoolAbi = parseAbi([\n \"function globalState() view returns (uint160 price, int24 tick, uint16 lastFee, uint8 pluginConfig, uint16 communityFee, bool unlocked)\",\n \"function tickSpacing() view returns (int24)\",\n ]);\n const [globalState, spacing] = await Promise.all([\n client.readContract({ address: poolAddr, abi: algebraPoolAbi, functionName: \"globalState\" }),\n client.readContract({ address: poolAddr, abi: algebraPoolAbi, functionName: \"tickSpacing\" }),\n ]);\n const currentTick = Number(globalState[1]);\n const tickSpace = Number(spacing);\n\n if (params.range_pct !== undefined) {\n // ±N% concentrated range\n const range = rangeToTicks(currentTick, params.range_pct, tickSpace);\n tickLower = range.tickLower;\n tickUpper = range.tickUpper;\n } else if (rawAmount0 > 0n && rawAmount1 === 0n) {\n tickLower = alignTickUp(currentTick + tickSpace, tickSpace);\n tickUpper = 887220;\n } else {\n tickLower = -887220;\n tickUpper = alignTickDown(currentTick - tickSpace, tickSpace);\n }\n }\n\n const amount0 = rawAmount0;\n const amount1 = rawAmount1;\n\n // Algebra V2 (NEST-style, has pool_deployer) uses no deployer field in MintParams\n // Algebra Integral (KittenSwap) includes deployer field\n const data = this.useSingleQuoter\n ? encodeFunctionData({\n abi: algebraV2PmAbi,\n functionName: \"mint\",\n args: [{ token0, token1, tickLower, tickUpper, amount0Desired: amount0, amount1Desired: amount1, amount0Min: 0n, amount1Min: 0n, recipient: params.recipient, deadline: BigInt(\"18446744073709551615\") }],\n })\n : encodeFunctionData({\n abi: algebraIntegralPmAbi,\n functionName: \"mint\",\n args: [{ token0, token1, deployer: zeroAddress as Address, tickLower, tickUpper, amount0Desired: amount0, amount1Desired: amount1, amount0Min: 0n, amount1Min: 0n, recipient: params.recipient, deadline: BigInt(\"18446744073709551615\") }],\n });\n\n // Only add approvals for non-zero amounts\n const approvals: { token: Address; spender: Address; amount: bigint }[] = [];\n if (amount0 > 0n) approvals.push({ token: token0, spender: pm, amount: amount0 });\n if (amount1 > 0n) approvals.push({ token: token1, spender: pm, amount: amount1 });\n\n return {\n description: `[${this.protocolName}] Add liquidity [${tickLower}, ${tickUpper}]`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 500_000,\n approvals,\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) throw DefiError.contractError(`[${this.protocolName}] Missing 'position_manager'`);\n if (!params.token_id) throw DefiError.invalidParam(`[${this.protocolName}] V3 remove_liquidity requires --token-id`);\n const MAX_UINT128 = (1n << 128n) - 1n;\n const deadline = BigInt(\"18446744073709551615\");\n const decreaseData = encodeFunctionData({\n abi: algebraSharedPmAbi, functionName: \"decreaseLiquidity\",\n args: [{ tokenId: params.token_id, liquidity: params.liquidity, amount0Min: 0n, amount1Min: 0n, deadline }],\n });\n const collectData = encodeFunctionData({\n abi: algebraSharedPmAbi, functionName: \"collect\",\n args: [{ tokenId: params.token_id, recipient: params.recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n });\n const data = encodeFunctionData({\n abi: algebraSharedPmAbi, functionName: \"multicall\",\n args: [[decreaseData, collectData]],\n });\n return {\n description: `[${this.protocolName}] Remove ${params.liquidity} liquidity from tokenId ${params.token_id}`,\n to: pm, data, value: 0n, gas_estimate: 400_000,\n };\n }\n}\n","/**\n * Convert a ±percentage to tick delta.\n * tickDelta = ln(1 + pct/100) / ln(1.0001)\n */\nexport function pctToTickDelta(pct: number): number {\n return Math.round(Math.log(1 + pct / 100) / Math.log(1.0001));\n}\n\n/**\n * Align a tick down to the nearest multiple of tickSpacing.\n */\nexport function alignTickDown(tick: number, tickSpacing: number): number {\n return Math.floor(tick / tickSpacing) * tickSpacing;\n}\n\n/**\n * Align a tick up to the nearest multiple of tickSpacing.\n */\nexport function alignTickUp(tick: number, tickSpacing: number): number {\n return Math.ceil(tick / tickSpacing) * tickSpacing;\n}\n\n/**\n * Calculate ±pct% tick range centered on currentTick, aligned to tickSpacing.\n */\nexport function rangeToTicks(\n currentTick: number,\n rangePct: number,\n tickSpacing: number,\n): { tickLower: number; tickUpper: number } {\n const delta = pctToTickDelta(rangePct);\n return {\n tickLower: alignTickDown(currentTick - delta, tickSpacing),\n tickUpper: alignTickUp(currentTick + delta, tickSpacing),\n };\n}\n","import { encodeFunctionData, parseAbi, zeroAddress } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swapSingleTokenExactIn(address pool, address tokenIn, address tokenOut, uint256 exactAmountIn, uint256 minAmountOut, uint256 deadline, bool wethIsEth, bytes calldata userData) external returns (uint256 amountOut)\",\n]);\n\nexport class BalancerV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const minAmountOut = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n\n // Balancer V3 requires a pool address. For now use a simplified single-pool swap.\n // In production, the pool would be resolved from the registry or an on-chain query.\n const data = encodeFunctionData({\n abi,\n functionName: \"swapSingleTokenExactIn\",\n args: [\n zeroAddress, // TODO: resolve pool from registry\n params.token_in,\n params.token_out,\n params.amount_in,\n minAmountOut,\n deadline,\n false,\n \"0x\",\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} via Balancer V3`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC`);\n }\n\n async buildAddLiquidity(_params: AddLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] add_liquidity requires pool-specific params`);\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] remove_liquidity requires pool-specific params`);\n }\n}\n","import { encodeFunctionData, parseAbi } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst poolAbi = parseAbi([\n \"function exchange(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns (uint256)\",\n \"function get_dy(int128 i, int128 j, uint256 dx) external view returns (uint256)\",\n \"function add_liquidity(uint256[2] amounts, uint256 min_mint_amount) external returns (uint256)\",\n \"function remove_liquidity(uint256 amount, uint256[2] min_amounts) external returns (uint256[2])\",\n]);\n\nexport class CurveStableSwapAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n // Direct pool exchange: swap token at index 0 for token at index 1.\n // The `router` address is treated as the pool address for direct swaps.\n // Callers should set the pool address as the \"router\" contract in the registry\n // when targeting a specific Curve pool.\n // Without prior quote, set min output to 0. Use quote() first for slippage protection.\n const minDy = 0n;\n\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"exchange\",\n args: [0n, 1n, params.amount_in, minDy],\n });\n\n return {\n description: `[${this.protocolName}] Curve pool exchange ${params.amount_in} tokens (index 0 -> 1)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC connection`);\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n // Add liquidity to a 2-token Curve pool\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"add_liquidity\",\n args: [[params.amount_a, params.amount_b], 0n],\n });\n\n return {\n description: `[${this.protocolName}] Curve add liquidity`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n // Remove liquidity from a 2-token Curve pool\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"remove_liquidity\",\n args: [params.liquidity, [0n, 0n]],\n });\n\n return {\n description: `[${this.protocolName}] Curve remove liquidity`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"struct Route { address from; address to; bool stable; }\",\n \"function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, (address from, address to, bool stable)[] calldata routes, address to, uint256 deadline) external returns (uint256[] memory amounts)\",\n \"function getAmountsOut(uint256 amountIn, (address from, address to, bool stable)[] calldata routes) external view returns (uint256[] memory amounts)\",\n \"function addLiquidity(address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity)\",\n \"function removeLiquidity(address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB)\",\n]);\n\n// Velodrome V2 / Aerodrome style: Route includes factory address\nconst abiV2 = parseAbi([\n \"function getAmountsOut(uint256 amountIn, (address from, address to, bool stable, address factory)[] calldata routes) external view returns (uint256[] memory amounts)\",\n]);\n\nexport class SolidlyAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n /** Default to volatile (false). True for stablecoin pairs. */\n private readonly defaultStable: boolean;\n private readonly rpcUrl: string | undefined;\n /** Factory address — present on Velodrome V2 / Aerodrome forks */\n private readonly factory: Address | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.defaultStable = false;\n this.rpcUrl = rpcUrl;\n this.factory = entry.contracts?.[\"factory\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const amountOutMin = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n\n const routes = [\n { from: params.token_in, to: params.token_out, stable: this.defaultStable },\n ];\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swapExactTokensForTokens\",\n args: [params.amount_in, amountOutMin, routes, params.recipient, deadline],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokens via Solidly`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n private encodeV1(params: QuoteParams, stable: boolean): `0x${string}` {\n return encodeFunctionData({\n abi,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, [{ from: params.token_in, to: params.token_out, stable }]],\n });\n }\n\n private encodeV2(params: QuoteParams, stable: boolean): `0x${string}` {\n return encodeFunctionData({\n abi: abiV2,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, [{ from: params.token_in, to: params.token_out, stable, factory: this.factory! }]],\n });\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n\n // Build all route variant candidates in one multicall batch.\n // Order: V2 variants first (if factory present), then V1 volatile + stable.\n const candidates: Array<{ callData: `0x${string}`; stable: boolean }> = [\n { callData: this.encodeV1(params, false), stable: false },\n { callData: this.encodeV1(params, true), stable: true },\n ];\n if (this.factory) {\n candidates.unshift(\n { callData: this.encodeV2(params, false), stable: false },\n { callData: this.encodeV2(params, true), stable: true },\n );\n }\n\n const rawResults = await multicallRead(\n this.rpcUrl,\n candidates.map((c) => [this.router, c.callData]),\n );\n\n let bestOut = 0n;\n let bestStable = false;\n for (let i = 0; i < rawResults.length; i++) {\n const raw = rawResults[i];\n if (!raw) continue;\n try {\n const [amounts] = decodeAbiParameters(\n [{ name: \"amounts\", type: \"uint256[]\" }],\n raw,\n );\n const out = amounts.length >= 2 ? amounts[amounts.length - 1] : 0n;\n if (out > bestOut) {\n bestOut = out;\n bestStable = candidates[i].stable;\n }\n } catch {\n // Route failed — skip\n }\n }\n\n if (bestOut === 0n) {\n throw DefiError.rpcError(`[${this.protocolName}] getAmountsOut returned zero for all routes`);\n }\n\n return {\n protocol: this.protocolName,\n amount_out: bestOut,\n price_impact_bps: undefined,\n fee_bps: bestStable ? 4 : 20,\n route: [`${params.token_in} -> ${params.token_out} (stable: ${bestStable})`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"addLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n this.defaultStable,\n params.amount_a,\n params.amount_b,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity (Solidly)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 350_000,\n approvals: [\n { token: params.token_a, spender: this.router, amount: params.amount_a },\n { token: params.token_b, spender: this.router, amount: params.amount_b },\n ],\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"removeLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n this.defaultStable,\n params.liquidity,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Remove liquidity (Solidly)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport { rangeToTicks, alignTickUp, alignTickDown } from \"./tick_math.js\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\n// Thena V3 CL NonfungiblePositionManager (includes tickSpacing + sqrtPriceX96 in MintParams)\nconst thenaPmAbi = parseAbi([\n \"struct MintParams { address token0; address token1; int24 tickSpacing; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; uint160 sqrtPriceX96; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n \"struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; }\",\n \"function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; }\",\n \"function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1)\",\n \"function multicall(bytes[] data) external payable returns (bytes[] memory results)\",\n]);\n\nconst thenaRouterAbi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; int24 tickSpacing; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\nconst thenaPoolAbi = parseAbi([\n \"function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, bool unlocked)\",\n \"function tickSpacing() view returns (int24)\",\n \"function token0() view returns (address)\",\n \"function token1() view returns (address)\",\n]);\n\nconst thenaFactoryAbi = parseAbi([\n \"function getPool(address tokenA, address tokenB, int24 tickSpacing) view returns (address)\",\n]);\n\nexport class ThenaCLAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly positionManager: Address | undefined;\n private readonly factory: Address | undefined;\n private readonly rpcUrl: string | undefined;\n private readonly defaultTickSpacing: number;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n this.router = router;\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.factory = entry.contracts?.[\"pool_factory\"];\n this.rpcUrl = rpcUrl;\n this.defaultTickSpacing = 50;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: thenaRouterAbi,\n functionName: \"exactInputSingle\",\n args: [{\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n tickSpacing: this.defaultTickSpacing,\n recipient: params.recipient,\n deadline: BigInt(params.deadline ?? 18446744073709551615n),\n amountIn: params.amount_in,\n amountOutMinimum: 0n,\n sqrtPriceLimitX96: 0n,\n }],\n });\n return {\n description: `[${this.protocolName}] Swap`,\n to: this.router, data, value: 0n, gas_estimate: 300_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote not yet implemented — use swap router`);\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) throw new DefiError(\"CONTRACT_ERROR\", \"Position manager not configured\");\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n\n // Sort tokens\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n // Resolve pool and tick range\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const poolAddr = params.pool as Address | undefined;\n let tickSpacing = this.defaultTickSpacing;\n let tickLower = params.tick_lower ?? 0;\n let tickUpper = params.tick_upper ?? 0;\n\n // If pool provided or we need to auto-detect ticks\n if (poolAddr || !params.tick_lower || !params.tick_upper) {\n let pool = poolAddr;\n if (!pool && this.factory) {\n pool = await client.readContract({\n address: this.factory, abi: thenaFactoryAbi, functionName: \"getPool\",\n args: [token0, token1, tickSpacing],\n }) as Address;\n if (pool === zeroAddress) throw new DefiError(\"CONTRACT_ERROR\", \"Pool not found\");\n }\n if (pool) {\n const [slot0, ts] = await Promise.all([\n client.readContract({ address: pool, abi: thenaPoolAbi, functionName: \"slot0\" }),\n client.readContract({ address: pool, abi: thenaPoolAbi, functionName: \"tickSpacing\" }),\n ]);\n const currentTick = Number((slot0 as readonly [bigint, number, ...unknown[]])[1]);\n tickSpacing = Number(ts);\n\n if (params.range_pct !== undefined) {\n // ±N% concentrated range\n const range = rangeToTicks(currentTick, params.range_pct, tickSpacing);\n tickLower = range.tickLower;\n tickUpper = range.tickUpper;\n } else if (!params.tick_lower && !params.tick_upper) {\n const isSingleSide = rawAmount0 === 0n || rawAmount1 === 0n;\n if (isSingleSide) {\n if (rawAmount0 > 0n) {\n tickLower = alignTickUp(currentTick + tickSpacing, tickSpacing);\n tickUpper = Math.floor(887272 / tickSpacing) * tickSpacing;\n } else {\n tickLower = Math.ceil(-887272 / tickSpacing) * tickSpacing;\n tickUpper = alignTickDown(currentTick - tickSpacing, tickSpacing);\n }\n } else {\n tickLower = Math.ceil(-887272 / tickSpacing) * tickSpacing;\n tickUpper = Math.floor(887272 / tickSpacing) * tickSpacing;\n }\n }\n }\n }\n\n // Apply explicit tick params (override auto-detected)\n if (params.tick_lower !== undefined) tickLower = params.tick_lower;\n if (params.tick_upper !== undefined) tickUpper = params.tick_upper;\n\n const data = encodeFunctionData({\n abi: thenaPmAbi,\n functionName: \"mint\",\n args: [{\n token0, token1,\n tickSpacing,\n tickLower, tickUpper,\n amount0Desired: rawAmount0,\n amount1Desired: rawAmount1,\n amount0Min: 0n, amount1Min: 0n,\n recipient: params.recipient,\n deadline: BigInt(\"18446744073709551615\"),\n sqrtPriceX96: 0n,\n }],\n });\n\n const approvals: { token: Address; spender: Address; amount: bigint }[] = [];\n if (rawAmount0 > 0n) approvals.push({ token: token0, spender: pm, amount: rawAmount0 });\n if (rawAmount1 > 0n) approvals.push({ token: token1, spender: pm, amount: rawAmount1 });\n\n return {\n description: `[${this.protocolName}] Add liquidity [${tickLower}, ${tickUpper}]`,\n to: pm, data, value: 0n, gas_estimate: 700_000, approvals,\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) throw DefiError.contractError(`[${this.protocolName}] Missing 'position_manager'`);\n if (!params.token_id) throw DefiError.invalidParam(`[${this.protocolName}] V3 remove_liquidity requires --token-id`);\n const MAX_UINT128 = (1n << 128n) - 1n;\n const deadline = BigInt(\"18446744073709551615\");\n const decreaseData = encodeFunctionData({\n abi: thenaPmAbi, functionName: \"decreaseLiquidity\",\n args: [{ tokenId: params.token_id, liquidity: params.liquidity, amount0Min: 0n, amount1Min: 0n, deadline }],\n });\n const collectData = encodeFunctionData({\n abi: thenaPmAbi, functionName: \"collect\",\n args: [{ tokenId: params.token_id, recipient: params.recipient, amount0Max: MAX_UINT128, amount1Max: MAX_UINT128 }],\n });\n const data = encodeFunctionData({\n abi: thenaPmAbi, functionName: \"multicall\",\n args: [[decreaseData, collectData]],\n });\n return {\n description: `[${this.protocolName}] Remove ${params.liquidity} liquidity from tokenId ${params.token_id}`,\n to: pm, data, value: 0n, gas_estimate: 400_000,\n };\n }\n}\n","import { createPublicClient, decodeFunctionResult, encodeFunctionData, http, parseAbi, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type {\n IGaugeSystem,\n GaugedPool,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\n// Multicall decode helpers\nconst _addressDecodeAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressDecodeAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\nconst _symbolDecodeAbi = parseAbi([\"function symbol() external view returns (string)\"]);\nfunction decodeSymbol(data: Hex | null): string {\n if (!data) return \"?\";\n try {\n return decodeFunctionResult({ abi: _symbolDecodeAbi, functionName: \"symbol\", data }) as string;\n } catch {\n return \"?\";\n }\n}\n\nconst gaugeManagerAbi = parseAbi([\n \"function gauges(address pool) view returns (address gauge)\",\n \"function isGauge(address gauge) view returns (bool)\",\n \"function isAlive(address gauge) view returns (bool)\",\n \"function claimRewards(address gauge, uint256[] tokenIds, uint8 redeemType) external\",\n]);\n\nconst gaugeCLAbi = parseAbi([\n \"function deposit(uint256 tokenId) external\",\n \"function withdraw(uint256 tokenId, uint8 redeemType) external\",\n \"function earned(uint256 tokenId) view returns (uint256)\",\n \"function balanceOf(uint256 tokenId) view returns (uint256)\",\n \"function rewardToken() view returns (address)\",\n]);\n\nconst nfpmAbi = parseAbi([\n \"function approve(address to, uint256 tokenId) external\",\n \"function getApproved(uint256 tokenId) view returns (address)\",\n]);\n\nconst veAbi = parseAbi([\n \"function create_lock(uint256 value, uint256 lock_duration) external returns (uint256)\",\n \"function increase_amount(uint256 tokenId, uint256 value) external\",\n \"function increase_unlock_time(uint256 tokenId, uint256 lock_duration) external\",\n \"function withdraw(uint256 tokenId) external\",\n]);\n\nconst voterAbi = parseAbi([\n \"function vote(uint256 tokenId, address[] pools, uint256[] weights) external\",\n \"function claimBribes(address[] bribes, address[][] tokens, uint256 tokenId) external\",\n \"function claimFees(address[] fees, address[][] tokens, uint256 tokenId) external\",\n]);\n\n/**\n * Hybra ve(3,3) Gauge adapter using GaugeManager pattern.\n * CL gauges require NFT deposit and claim goes through GaugeManager (not directly to gauge).\n */\nexport class HybraGaugeAdapter implements IGaugeSystem {\n private readonly protocolName: string;\n private readonly gaugeManager: Address;\n private readonly veToken: Address;\n private readonly voter: Address;\n private readonly positionManager: Address;\n private readonly poolFactory: Address | undefined;\n private readonly rpcUrl: string | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const gm = entry.contracts?.[\"gauge_manager\"];\n if (!gm) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'gauge_manager' contract\");\n this.gaugeManager = gm;\n const ve = entry.contracts?.[\"ve_token\"];\n if (!ve) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 've_token' contract\");\n this.veToken = ve;\n this.voter = entry.contracts?.[\"voter\"] ?? zeroAddress as Address;\n this.positionManager = entry.contracts?.[\"position_manager\"] ?? zeroAddress as Address;\n this.poolFactory = entry.contracts?.[\"pool_factory\"];\n this.rpcUrl = rpcUrl;\n }\n\n name(): string { return this.protocolName; }\n\n // ─── Gauge Discovery ──────────────────────────────────────\n\n async discoverGaugedPools(): Promise<GaugedPool[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for gauge discovery\");\n if (!this.poolFactory) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'pool_factory' contract\");\n\n const factoryAbi = parseAbi([\n \"function allPoolsLength() external view returns (uint256)\",\n \"function allPools(uint256) external view returns (address)\",\n ]);\n const poolAbi = parseAbi([\n \"function token0() external view returns (address)\",\n \"function token1() external view returns (address)\",\n ]);\n const erc20SymbolAbi = parseAbi([\"function symbol() external view returns (string)\"]);\n const gaugesAbi = parseAbi([\"function gauges(address pool) view returns (address gauge)\"]);\n\n // Step 1: get total pool count\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n let poolCount: bigint;\n try {\n poolCount = await client.readContract({\n address: this.poolFactory,\n abi: factoryAbi,\n functionName: \"allPoolsLength\",\n }) as bigint;\n } catch {\n return [];\n }\n\n const count = Number(poolCount);\n if (count === 0) return [];\n\n // Step 2: batch-fetch all pool addresses\n const poolAddressCalls: Array<[Address, Hex]> = [];\n for (let i = 0; i < count; i++) {\n poolAddressCalls.push([\n this.poolFactory,\n encodeFunctionData({ abi: factoryAbi, functionName: \"allPools\", args: [BigInt(i)] }),\n ]);\n }\n const poolAddressResults = await multicallRead(this.rpcUrl, poolAddressCalls);\n const pools: Address[] = poolAddressResults\n .map((r) => decodeAddress(r))\n .filter((a): a is Address => a !== null && a !== zeroAddress);\n\n if (pools.length === 0) return [];\n\n // Step 3: batch GaugeManager.gauges(pool) for all pools\n const gaugeCalls: Array<[Address, Hex]> = pools.map((pool) => [\n this.gaugeManager,\n encodeFunctionData({ abi: gaugesAbi, functionName: \"gauges\", args: [pool] }),\n ]);\n const gaugeResults = await multicallRead(this.rpcUrl, gaugeCalls);\n\n // Filter pools that have an active gauge\n const gaugedPools: Array<{ pool: Address; gauge: Address }> = [];\n for (let i = 0; i < pools.length; i++) {\n const gauge = decodeAddress(gaugeResults[i] ?? null);\n if (gauge && gauge !== zeroAddress) {\n gaugedPools.push({ pool: pools[i]!, gauge });\n }\n }\n\n if (gaugedPools.length === 0) return [];\n\n // Step 4: batch token0() and token1() for gauged pools\n const tokenCalls: Array<[Address, Hex]> = [];\n for (const { pool } of gaugedPools) {\n tokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token0\" })]);\n tokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token1\" })]);\n }\n const tokenResults = await multicallRead(this.rpcUrl, tokenCalls);\n\n // Step 5: collect unique token addresses and fetch symbols\n const tokenAddrs = new Set<Address>();\n for (let i = 0; i < gaugedPools.length; i++) {\n const t0 = decodeAddress(tokenResults[i * 2] ?? null);\n const t1 = decodeAddress(tokenResults[i * 2 + 1] ?? null);\n if (t0 && t0 !== zeroAddress) tokenAddrs.add(t0);\n if (t1 && t1 !== zeroAddress) tokenAddrs.add(t1);\n }\n\n const uniqueTokens = Array.from(tokenAddrs);\n const symbolCalls: Array<[Address, Hex]> = uniqueTokens.map((t) => [\n t,\n encodeFunctionData({ abi: erc20SymbolAbi, functionName: \"symbol\" }),\n ]);\n const symbolResults = await multicallRead(this.rpcUrl, symbolCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeSymbol(symbolResults[i] ?? null));\n }\n\n // Step 6: assemble results\n const out: GaugedPool[] = [];\n for (let i = 0; i < gaugedPools.length; i++) {\n const { pool, gauge } = gaugedPools[i]!;\n const t0 = decodeAddress(tokenResults[i * 2] ?? null);\n const t1 = decodeAddress(tokenResults[i * 2 + 1] ?? null);\n out.push({\n pool,\n gauge,\n token0: t0 ? (symbolMap.get(t0) ?? t0.slice(0, 10)) : \"?\",\n token1: t1 ? (symbolMap.get(t1) ?? t1.slice(0, 10)) : \"?\",\n token0Addr: t0 ?? undefined,\n token1Addr: t1 ?? undefined,\n type: \"CL\",\n });\n }\n\n return out;\n }\n\n // ─── Gauge Lookup ──────────────────────────────────────────\n\n async resolveGauge(pool: Address): Promise<Address> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const gauge = await client.readContract({\n address: this.gaugeManager, abi: gaugeManagerAbi,\n functionName: \"gauges\", args: [pool],\n }) as Address;\n if (gauge === zeroAddress) throw new DefiError(\"CONTRACT_ERROR\", `No gauge for pool ${pool}`);\n return gauge;\n }\n\n // ─── CL Gauge: NFT Deposit/Withdraw ──────────────────────────\n\n async buildDeposit(gauge: Address, _amount: bigint, tokenId?: bigint): Promise<DeFiTx> {\n if (tokenId === undefined) throw new DefiError(\"CONTRACT_ERROR\", \"tokenId required for CL gauge deposit\");\n\n // Pre-tx: approve NFT to gauge\n const approveTx: DeFiTx = {\n description: `[${this.protocolName}] Approve NFT #${tokenId} to gauge`,\n to: this.positionManager,\n data: encodeFunctionData({ abi: nfpmAbi, functionName: \"approve\", args: [gauge, tokenId] }),\n value: 0n, gas_estimate: 80_000,\n };\n\n return {\n description: `[${this.protocolName}] Deposit NFT #${tokenId} to gauge`,\n to: gauge,\n data: encodeFunctionData({ abi: gaugeCLAbi, functionName: \"deposit\", args: [tokenId] }),\n value: 0n, gas_estimate: 500_000,\n pre_txs: [approveTx],\n };\n }\n\n async buildWithdraw(gauge: Address, _amount: bigint, tokenId?: bigint, opts?: { redeemType?: number }): Promise<DeFiTx> {\n if (tokenId === undefined) throw new DefiError(\"CONTRACT_ERROR\", \"tokenId required for CL gauge withdraw\");\n const redeemType = opts?.redeemType ?? 1;\n const warning = redeemType === 1\n ? \" — WARNING: redeemType=1 locks accumulated rewards into 2-year veHYBR NFT. Use --redeem-type 0 for instant exit (with penalty).\"\n : \"\";\n return {\n description: `[${this.protocolName}] Withdraw NFT #${tokenId} from gauge (redeemType=${redeemType})${warning}`,\n to: gauge,\n data: encodeFunctionData({ abi: gaugeCLAbi, functionName: \"withdraw\", args: [tokenId, redeemType] }),\n value: 0n, gas_estimate: 1_000_000,\n };\n }\n\n // ─── Claim: via GaugeManager ──────────────────────────────────\n\n async buildClaimRewards(gauge: Address, _account?: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] Use buildClaimRewardsByTokenId for CL gauges`);\n }\n\n async buildClaimRewardsByTokenId(gauge: Address, tokenId: bigint, opts?: { redeemType?: number }): Promise<DeFiTx> {\n // redeemType: 0 = instant exit (with penalty), 1 = lock into 2-year veHYBR (default)\n const redeemType = opts?.redeemType ?? 1;\n return {\n description: `[${this.protocolName}] Claim rewards for NFT #${tokenId} (redeemType=${redeemType})`,\n to: this.gaugeManager,\n data: encodeFunctionData({\n abi: gaugeManagerAbi, functionName: \"claimRewards\",\n args: [gauge, [tokenId], redeemType],\n }),\n value: 0n, gas_estimate: 1_000_000,\n };\n }\n\n // ─── Pending Rewards ──────────────────────────────────────────\n\n async getPendingRewards(gauge: Address, _user: Address): Promise<RewardInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] Use getPendingRewardsByTokenId for CL gauges`);\n }\n\n async getPendingRewardsByTokenId(gauge: Address, tokenId: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return await client.readContract({\n address: gauge, abi: gaugeCLAbi,\n functionName: \"earned\", args: [tokenId],\n }) as bigint;\n }\n\n // ─── VoteEscrow ──────────────────────────────────────────────\n\n async buildCreateLock(amount: bigint, lockDuration: number): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Create veNFT lock`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"create_lock\", args: [amount, BigInt(lockDuration)] }),\n value: 0n, gas_estimate: 300_000,\n };\n }\n\n async buildIncreaseAmount(tokenId: bigint, amount: bigint): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Increase veNFT #${tokenId}`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"increase_amount\", args: [tokenId, amount] }),\n value: 0n, gas_estimate: 200_000,\n };\n }\n\n async buildIncreaseUnlockTime(tokenId: bigint, lockDuration: number): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Extend veNFT #${tokenId} lock`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"increase_unlock_time\", args: [tokenId, BigInt(lockDuration)] }),\n value: 0n, gas_estimate: 200_000,\n };\n }\n\n async buildWithdrawExpired(tokenId: bigint): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Withdraw expired veNFT #${tokenId}`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"withdraw\", args: [tokenId] }),\n value: 0n, gas_estimate: 200_000,\n };\n }\n\n // ─── Voter ──────────────────────────────────────────────────\n\n async buildVote(tokenId: bigint, pools: Address[], weights: bigint[]): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Vote with veNFT #${tokenId}`,\n to: this.voter,\n data: encodeFunctionData({ abi: voterAbi, functionName: \"vote\", args: [tokenId, pools, weights] }),\n value: 0n, gas_estimate: 500_000,\n };\n }\n\n async buildClaimBribes(bribes: Address[], tokenId: bigint): Promise<DeFiTx> {\n const tokensPerBribe: Address[][] = bribes.map(() => []);\n return {\n description: `[${this.protocolName}] Claim bribes for veNFT #${tokenId}`,\n to: this.voter,\n data: encodeFunctionData({ abi: voterAbi, functionName: \"claimBribes\", args: [bribes, tokensPerBribe, tokenId] }),\n value: 0n, gas_estimate: 300_000,\n };\n }\n\n async buildClaimFees(fees: Address[], tokenId: bigint): Promise<DeFiTx> {\n const tokensPerFee: Address[][] = fees.map(() => []);\n return {\n description: `[${this.protocolName}] Claim fees for veNFT #${tokenId}`,\n to: this.voter,\n data: encodeFunctionData({ abi: voterAbi, functionName: \"claimFees\", args: [fees, tokensPerFee, tokenId] }),\n value: 0n, gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, zeroAddress } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swap(address fromToken, address toToken, uint256 fromAmount, uint256 minToAmount, address to, address rebateTo) external payable returns (uint256 realToAmount)\",\n]);\n\nexport class WooFiAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const minToAmount = 0n;\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swap\",\n args: [\n params.token_in,\n params.token_out,\n params.amount_in,\n minToAmount,\n params.recipient,\n zeroAddress,\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} via WOOFi`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC`);\n }\n\n async buildAddLiquidity(_params: AddLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] WOOFi does not support LP positions via router`);\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] WOOFi does not support LP positions via router`);\n }\n}\n","import { createPublicClient, decodeFunctionResult, encodeFunctionData, http, parseAbi, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type {\n IGaugeSystem,\n GaugedPool,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst gaugeAbi = parseAbi([\n \"function deposit(uint256 amount) external\",\n \"function depositFor(uint256 amount, uint256 tokenId) external\",\n \"function withdraw(uint256 amount) external\",\n \"function getReward() external\",\n \"function getReward(address account) external\",\n \"function getReward(address account, address[] tokens) external\",\n \"function getReward(uint256 tokenId) external\",\n // Ramses CL gauge factory (delegate target): tokenId-keyed multi-token claim\n \"function getReward(uint256 tokenId, address[] tokens) external\",\n \"function earned(address account) external view returns (uint256)\",\n \"function earned(address account, uint256 tokenId) external view returns (uint256)\",\n \"function earned(address token, address account) external view returns (uint256)\",\n \"function earned(uint256 tokenId) external view returns (uint256)\",\n // Ramses CL: token-first + tokenId (no account; account is ownerOf(tokenId) inferred by gauge)\n \"function earned(address token, uint256 tokenId) external view returns (uint256)\",\n \"function rewardRate() external view returns (uint256)\",\n \"function rewardToken() external view returns (address)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function rewardsListLength() external view returns (uint256)\",\n \"function rewardData(address token) external view returns (uint256 periodFinish, uint256 rewardRate, uint256 lastUpdateTime, uint256 rewardPerTokenStored)\",\n // Ramses CL gauge factory exposes the canonical reward-token list\n \"function getRewardTokens() external view returns (address[])\",\n \"function nonfungiblePositionManager() external view returns (address)\",\n]);\n\nconst veAbi = parseAbi([\n \"function create_lock(uint256 value, uint256 lock_duration) external returns (uint256)\",\n \"function increase_amount(uint256 tokenId, uint256 value) external\",\n \"function increase_unlock_time(uint256 tokenId, uint256 lock_duration) external\",\n \"function withdraw(uint256 tokenId) external\",\n \"function balanceOfNFT(uint256 tokenId) external view returns (uint256)\",\n \"function locked(uint256 tokenId) external view returns (uint256 amount, uint256 end)\",\n]);\n\nconst voterAbi = parseAbi([\n \"function vote(uint256 tokenId, address[] calldata pools, uint256[] calldata weights) external\",\n \"function claimBribes(address[] calldata bribes, address[][] calldata tokens, uint256 tokenId) external\",\n \"function claimFees(address[] calldata fees, address[][] calldata tokens, uint256 tokenId) external\",\n \"function gauges(address pool) external view returns (address)\",\n \"function gaugeForPool(address pool) external view returns (address)\",\n \"function poolToGauge(address pool) external view returns (address)\",\n]);\n\n// Multicall decode helpers\nconst _addressDecodeAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressDecodeAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\nconst _symbolDecodeAbi = parseAbi([\"function symbol() external view returns (string)\"]);\nfunction decodeSymbol(data: Hex | null): string {\n if (!data) return \"?\";\n try {\n return decodeFunctionResult({ abi: _symbolDecodeAbi, functionName: \"symbol\", data }) as string;\n } catch {\n return \"?\";\n }\n}\n\nconst _boolDecodeAbi = parseAbi([\"function f() external view returns (bool)\"]);\nfunction decodeBoolean(data: Hex): boolean {\n try {\n return decodeFunctionResult({ abi: _boolDecodeAbi, functionName: \"f\", data }) as boolean;\n } catch {\n return false;\n }\n}\n\n// HyperEVM well-known token addresses for CL pool discovery\nconst HYPEREVM_TOKENS: Record<string, Address> = {\n WHYPE: \"0x5555555555555555555555555555555555555555\",\n USDC: \"0xb88339CB7199b77E23DB6E890353E22632Ba630f\",\n USDT0: \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\",\n UETH: \"0xBe6727B535545C67d5cAa73dEa54865B92CF7907\",\n UBTC: \"0x9FDBdA0A5e284c32744D2f17Ee5c74B284993463\",\n USDH: \"0x111111a1a0667d36bD57c0A9f569b98057111111\",\n USDe: \"0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34\",\n sUSDe: \"0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2\",\n XAUt0: \"0xf4D9235269a96aaDaFc9aDAe454a0618eBE37949\",\n kHYPE: \"0xfD739d4e423301CE9385c1fb8850539D657C296D\",\n RAM: \"0x555570a286F15EbDFE42B66eDE2f724Aa1AB5555\",\n hyperRAM: \"0xAAAE8378809bb8815c08D3C59Eb0c7D1529aD769\",\n};\n\nconst CL_TICK_SPACINGS = [1, 5, 10, 50, 100, 200];\n\nexport class SolidlyGaugeAdapter implements IGaugeSystem {\n private readonly protocolName: string;\n private readonly voter: Address;\n private readonly veToken: Address;\n private readonly rpcUrl: string | undefined;\n private readonly clFactory: Address | undefined;\n private readonly v2Factory: Address | undefined;\n private readonly tokens: Address[] | undefined;\n // CL gauges (Aerodrome Slipstream / Velodrome CL) take an LP NFT via deposit(tokenId);\n // V2 gauges take an LP token amount via deposit(amount). Detect via uniswap_v3 + position_manager.\n private readonly clNftMode: boolean;\n private readonly positionManager: Address | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string, tokens?: Address[]) {\n this.protocolName = entry.name;\n const voter = entry.contracts?.[\"voter\"];\n if (!voter) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'voter' contract\");\n }\n const veToken = entry.contracts?.[\"ve_token\"];\n if (!veToken) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 've_token' contract\");\n }\n this.voter = voter;\n this.veToken = veToken;\n this.rpcUrl = rpcUrl;\n this.tokens = tokens;\n this.clFactory = entry.contracts?.[\"cl_factory\"] ?? entry.contracts?.[\"factory\"];\n this.v2Factory = entry.contracts?.[\"pair_factory\"] ?? entry.contracts?.[\"factory\"];\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.clNftMode = entry.interface === \"uniswap_v3\" && this.positionManager !== undefined;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n /** Scan V2 and CL factories for pools that have active emission gauges. */\n async discoverGaugedPools(): Promise<GaugedPool[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for gauge discovery\");\n\n const results: GaugedPool[] = [];\n\n await Promise.all([\n this._discoverV2GaugedPools(results),\n this._discoverCLGaugedPools(results),\n ]);\n\n // Batch query rewardRate + totalSupply + rewardToken for all gauges\n await this._enrichGaugeMetrics(results);\n\n return results;\n }\n\n /**\n * Batch query rewardRate, totalSupply, rewardToken for all discovered gauges.\n * Handles both single-token (rewardRate) and multi-token (rewardData) gauges.\n */\n private async _enrichGaugeMetrics(pools: GaugedPool[]): Promise<void> {\n if (!this.rpcUrl || pools.length === 0) return;\n\n const _u256Abi = parseAbi([\"function f() view returns (uint256)\"]);\n\n // Phase 1: batch rewardRate + totalSupply + rewardToken\n const calls: Array<[Address, Hex]> = [];\n for (const p of pools) {\n calls.push([p.gauge, encodeFunctionData({ abi: gaugeAbi, functionName: \"rewardRate\" })]);\n calls.push([p.gauge, encodeFunctionData({ abi: gaugeAbi, functionName: \"totalSupply\" })]);\n calls.push([p.gauge, encodeFunctionData({ abi: gaugeAbi, functionName: \"rewardToken\" })]);\n }\n\n const results = await multicallRead(this.rpcUrl, calls).catch(() => [] as (Hex | undefined)[]);\n\n for (let i = 0; i < pools.length; i++) {\n const base = i * 3;\n try {\n pools[i]!.rewardRate = results[base] ? decodeFunctionResult({ abi: _u256Abi, functionName: \"f\", data: results[base]! }) as bigint : 0n;\n } catch { pools[i]!.rewardRate = 0n; }\n try {\n pools[i]!.totalStaked = results[base + 1] ? decodeFunctionResult({ abi: _u256Abi, functionName: \"f\", data: results[base + 1]! }) as bigint : 0n;\n } catch { pools[i]!.totalStaked = 0n; }\n try {\n pools[i]!.rewardToken = results[base + 2] ? decodeAddress(results[base + 2]!) ?? undefined : undefined;\n } catch { /* skip */ }\n }\n\n // Phase 2: for gauges with rewardRate=0, try rewardData(token) with known reward tokens\n // These are multi-token gauges (e.g. Ramses uses xRAM/WHYPE)\n const KNOWN_REWARD_TOKENS: Address[] = [\n \"0x555570a286F15EbDFE42B66eDE2f724Aa1AB5555\" as Address, // xRAM\n \"0x5555555555555555555555555555555555555555\" as Address, // WHYPE\n \"0x067b0C72aa4C6Bd3BFEFfF443c536DCd6a25a9C8\" as Address, // HYBR\n \"0x07c57E32a3C29D5659bda1d3EFC2E7BF004E3035\" as Address, // NEST\n ];\n\n const needsFallback = pools.filter(p => (p.rewardRate ?? 0n) === 0n && (p.totalStaked ?? 0n) > 0n);\n if (needsFallback.length === 0) return;\n\n // Batch: rewardData(token) for each candidate token × each gauge\n const rdCalls: Array<[Address, Hex]> = [];\n const rdMeta: Array<{ poolIdx: number; token: Address }> = [];\n for (const p of needsFallback) {\n const poolIdx = pools.indexOf(p);\n for (const token of KNOWN_REWARD_TOKENS) {\n rdCalls.push([p.gauge, encodeFunctionData({ abi: gaugeAbi, functionName: \"rewardData\", args: [token] })]);\n rdMeta.push({ poolIdx, token });\n }\n }\n\n const rdResults = await multicallRead(this.rpcUrl, rdCalls).catch(() => [] as (Hex | undefined)[]);\n\n // rewardData returns (uint256 periodFinish, uint256 rewardRate, uint256 lastUpdateTime, uint256 rewardPerTokenStored)\n const _rdAbi = parseAbi([\"function f() view returns (uint256, uint256, uint256, uint256)\"]);\n for (let i = 0; i < rdMeta.length; i++) {\n const { poolIdx, token } = rdMeta[i]!;\n const pool = pools[poolIdx]!;\n // Skip if already found a reward rate for this pool\n if ((pool.rewardRate ?? 0n) > 0n) continue;\n try {\n if (!rdResults[i]) continue;\n const decoded = decodeFunctionResult({ abi: _rdAbi, functionName: \"f\", data: rdResults[i]! }) as [bigint, bigint, bigint, bigint];\n const [periodFinish, rewardRate] = decoded;\n const now = BigInt(Math.floor(Date.now() / 1000));\n if (rewardRate > 0n && periodFinish > now) {\n pool.rewardRate = rewardRate;\n pool.rewardToken = token;\n }\n } catch { /* skip */ }\n }\n }\n\n private async _discoverV2GaugedPools(out: GaugedPool[]): Promise<void> {\n if (!this.rpcUrl || !this.v2Factory) return;\n\n const pairAbi = parseAbi([\n \"function token0() external view returns (address)\",\n \"function token1() external view returns (address)\",\n \"function stable() external view returns (bool)\",\n ]);\n const erc20SymbolAbi = parseAbi([\"function symbol() external view returns (string)\"]);\n const voterLengthAbi = parseAbi([\"function length() external view returns (uint256)\"]);\n const voterPoolsAbi = parseAbi([\"function pools(uint256) external view returns (address)\"]);\n const gaugeForPoolAbi = parseAbi([\"function gaugeForPool(address) external view returns (address)\"]);\n const poolToGaugeAbi = parseAbi([\"function poolToGauge(address) external view returns (address)\"]);\n const gaugesAbi = parseAbi([\"function gauges(address) external view returns (address)\"]);\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // Strategy: prefer voter.pools() list (only gauged pools) over factory scan\n let pairs: Address[] = [];\n let voterPoolCount = 0;\n\n // Try voter.length() + voter.pools(i) — returns only pools with gauges\n try {\n const len = await client.readContract({ address: this.voter, abi: voterLengthAbi, functionName: \"length\" }) as bigint;\n voterPoolCount = Number(len);\n } catch { /* voter.length() not supported — fall back to factory scan */ }\n\n if (voterPoolCount > 0) {\n // Scan voter's pool list (max 500 most recent)\n const MAX_SCAN = 500;\n const startIdx = Math.max(0, voterPoolCount - MAX_SCAN);\n const poolCalls: Array<[Address, Hex]> = [];\n for (let i = startIdx; i < voterPoolCount; i++) {\n poolCalls.push([this.voter, encodeFunctionData({ abi: voterPoolsAbi, functionName: \"pools\", args: [BigInt(i)] })]);\n }\n const poolResults = await multicallRead(this.rpcUrl, poolCalls);\n pairs = poolResults.map(r => decodeAddress(r)).filter((a): a is Address => a !== null && a !== zeroAddress);\n } else {\n // Fallback: factory scan (for voters without length/pools)\n const v2FactoryAbi = parseAbi([\"function allPairsLength() view returns (uint256)\", \"function allPairs(uint256) view returns (address)\"]);\n const solidlyFactoryAbi = parseAbi([\"function allPoolsLength() view returns (uint256)\", \"function allPools(uint256) view returns (address)\"]);\n let pairCount = 0n;\n let useSolidly = false;\n try { pairCount = await client.readContract({ address: this.v2Factory, abi: v2FactoryAbi, functionName: \"allPairsLength\" }) as bigint; }\n catch { try { pairCount = await client.readContract({ address: this.v2Factory, abi: solidlyFactoryAbi, functionName: \"allPoolsLength\" }) as bigint; useSolidly = true; } catch { return; } }\n const count = Number(pairCount);\n if (count === 0) return;\n const MAX_SCAN = 500;\n const startIdx = Math.max(0, count - MAX_SCAN);\n const fetchAbi = useSolidly ? solidlyFactoryAbi : v2FactoryAbi;\n const fetchFn = useSolidly ? \"allPools\" as const : \"allPairs\" as const;\n const pairCalls: Array<[Address, Hex]> = [];\n for (let i = startIdx; i < count; i++) pairCalls.push([this.v2Factory, encodeFunctionData({ abi: fetchAbi, functionName: fetchFn, args: [BigInt(i)] })]);\n const pairResults = await multicallRead(this.rpcUrl, pairCalls);\n pairs = pairResults.map(r => decodeAddress(r)).filter((a): a is Address => a !== null && a !== zeroAddress);\n }\n\n if (pairs.length === 0) return;\n\n // Resolve gauges: try gaugeForPool → poolToGauge → gauges (Aerodrome/Velodrome)\n const gaugeCalls: Array<[Address, Hex]> = pairs.map(p => [this.voter, encodeFunctionData({ abi: gaugeForPoolAbi, functionName: \"gaugeForPool\", args: [p] })]);\n let gaugeResults = await multicallRead(this.rpcUrl, gaugeCalls);\n\n const allNull = gaugeResults.every(r => !r || decodeAddress(r) === zeroAddress || decodeAddress(r) === null);\n if (allNull) {\n const fb1: Array<[Address, Hex]> = pairs.map(p => [this.voter, encodeFunctionData({ abi: poolToGaugeAbi, functionName: \"poolToGauge\", args: [p] })]);\n gaugeResults = await multicallRead(this.rpcUrl, fb1);\n }\n const allNull2 = gaugeResults.every(r => !r || decodeAddress(r) === zeroAddress || decodeAddress(r) === null);\n if (allNull2) {\n const fb2: Array<[Address, Hex]> = pairs.map(p => [this.voter, encodeFunctionData({ abi: gaugesAbi, functionName: \"gauges\", args: [p] })]);\n gaugeResults = await multicallRead(this.rpcUrl, fb2);\n }\n\n // Filter only pairs that have a gauge\n const gaugedPairs: Array<{ pair: Address; gauge: Address }> = [];\n for (let i = 0; i < pairs.length; i++) {\n const gauge = decodeAddress(gaugeResults[i] ?? null);\n if (gauge && gauge !== zeroAddress) {\n gaugedPairs.push({ pair: pairs[i]!, gauge });\n }\n }\n\n if (gaugedPairs.length === 0) return;\n\n // Step 4: fetch token0, token1, stable for each gauged pair\n const metaCalls: Array<[Address, Hex]> = [];\n for (const { pair } of gaugedPairs) {\n metaCalls.push([pair, encodeFunctionData({ abi: pairAbi, functionName: \"token0\" })]);\n metaCalls.push([pair, encodeFunctionData({ abi: pairAbi, functionName: \"token1\" })]);\n metaCalls.push([pair, encodeFunctionData({ abi: pairAbi, functionName: \"stable\" })]);\n }\n const metaResults = await multicallRead(this.rpcUrl, metaCalls);\n\n // Step 5: collect unique token addresses and fetch symbols\n const tokenAddrs = new Set<Address>();\n for (let i = 0; i < gaugedPairs.length; i++) {\n const t0 = decodeAddress(metaResults[i * 3] ?? null);\n const t1 = decodeAddress(metaResults[i * 3 + 1] ?? null);\n if (t0 && t0 !== zeroAddress) tokenAddrs.add(t0);\n if (t1 && t1 !== zeroAddress) tokenAddrs.add(t1);\n }\n\n const uniqueTokens = Array.from(tokenAddrs);\n const symbolCalls: Array<[Address, Hex]> = uniqueTokens.map((t) => [\n t,\n encodeFunctionData({ abi: erc20SymbolAbi, functionName: \"symbol\" }),\n ]);\n const symbolResults = await multicallRead(this.rpcUrl, symbolCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeSymbol(symbolResults[i] ?? null));\n }\n\n // Step 6: assemble results\n for (let i = 0; i < gaugedPairs.length; i++) {\n const { pair, gauge } = gaugedPairs[i]!;\n const t0 = decodeAddress(metaResults[i * 3] ?? null);\n const t1 = decodeAddress(metaResults[i * 3 + 1] ?? null);\n const stableRaw = metaResults[i * 3 + 2];\n const stable = stableRaw ? decodeBoolean(stableRaw) : false;\n out.push({\n pool: pair,\n gauge,\n token0: t0 ? (symbolMap.get(t0) ?? t0.slice(0, 10)) : \"?\",\n token1: t1 ? (symbolMap.get(t1) ?? t1.slice(0, 10)) : \"?\",\n token0Addr: t0 ?? undefined,\n token1Addr: t1 ?? undefined,\n type: \"V2\",\n stable,\n });\n }\n }\n\n private async _discoverCLGaugedPools(out: GaugedPool[]): Promise<void> {\n if (!this.rpcUrl || !this.clFactory) return;\n\n const clFactoryAbi = parseAbi([\n \"function getPool(address tokenA, address tokenB, int24 tickSpacing) external view returns (address pool)\",\n ]);\n const algebraFactoryAbi = parseAbi([\n \"function poolByPair(address tokenA, address tokenB) external view returns (address pool)\",\n ]);\n const poolAbi = parseAbi([\n \"function token0() external view returns (address)\",\n \"function token1() external view returns (address)\",\n ]);\n const erc20SymbolAbi = parseAbi([\"function symbol() external view returns (string)\"]);\n const gaugeForPoolAbi = parseAbi([\"function gaugeForPool(address) external view returns (address)\"]);\n const poolToGaugeAbi = parseAbi([\"function poolToGauge(address) external view returns (address)\"]);\n\n const tokenAddresses = this.tokens ?? Object.values(HYPEREVM_TOKENS);\n\n // Generate all unique token pairs\n const pairs: Array<[Address, Address]> = [];\n for (let i = 0; i < tokenAddresses.length; i++) {\n for (let j = i + 1; j < tokenAddresses.length; j++) {\n pairs.push([tokenAddresses[i]!, tokenAddresses[j]!]);\n }\n }\n\n // Detect factory type: try poolByPair (Algebra) — if it returns non-null, it's Algebra\n const isAlgebra = await (async () => {\n try {\n const [result] = await multicallRead(this.rpcUrl!, [[\n this.clFactory!,\n encodeFunctionData({ abi: algebraFactoryAbi, functionName: \"poolByPair\", args: [tokenAddresses[0]!, tokenAddresses[1]!] }),\n ]]);\n // If poolByPair returns any data (even zero address), it's Algebra\n return result !== null && result.length >= 66;\n } catch {\n return false;\n }\n })();\n\n // Build pool lookup calls\n const getPoolCalls: Array<[Address, Hex]> = [];\n const callMeta: Array<{ pairIdx: number; tickSpacing: number }> = [];\n\n if (isAlgebra) {\n // Algebra: one pool per pair (no tickSpacing)\n for (let p = 0; p < pairs.length; p++) {\n const [tokenA, tokenB] = pairs[p]!;\n getPoolCalls.push([\n this.clFactory!,\n encodeFunctionData({ abi: algebraFactoryAbi, functionName: \"poolByPair\", args: [tokenA!, tokenB!] }),\n ]);\n callMeta.push({ pairIdx: p, tickSpacing: 0 });\n }\n } else {\n // Uniswap-style: multiple tick spacings per pair\n for (let p = 0; p < pairs.length; p++) {\n const [tokenA, tokenB] = pairs[p]!;\n for (const ts of CL_TICK_SPACINGS) {\n getPoolCalls.push([\n this.clFactory!,\n encodeFunctionData({ abi: clFactoryAbi, functionName: \"getPool\", args: [tokenA!, tokenB!, ts] }),\n ]);\n callMeta.push({ pairIdx: p, tickSpacing: ts });\n }\n }\n }\n\n const getPoolResults = await multicallRead(this.rpcUrl, getPoolCalls);\n\n // Collect non-zero pool addresses\n const candidatePools: Array<{ pool: Address; tokenA: Address; tokenB: Address; tickSpacing: number }> = [];\n for (let i = 0; i < getPoolCalls.length; i++) {\n const pool = decodeAddress(getPoolResults[i] ?? null);\n if (pool && pool !== zeroAddress) {\n const { pairIdx, tickSpacing } = callMeta[i]!;\n const [tokenA, tokenB] = pairs[pairIdx]!;\n candidatePools.push({ pool, tokenA: tokenA!, tokenB: tokenB!, tickSpacing });\n }\n }\n\n if (candidatePools.length === 0) return;\n\n // Batch gauge lookup — try gaugeForPool first, fallback to poolToGauge\n const gaugeCalls: Array<[Address, Hex]> = candidatePools.map(({ pool }) => [\n this.voter,\n encodeFunctionData({ abi: gaugeForPoolAbi, functionName: \"gaugeForPool\", args: [pool] }),\n ]);\n let gaugeResults = await multicallRead(this.rpcUrl, gaugeCalls);\n\n // If all results are null (gaugeForPool not supported), try poolToGauge\n const allNull = gaugeResults.every(r => !r || decodeAddress(r) === zeroAddress || decodeAddress(r) === null);\n if (allNull) {\n const fallbackCalls: Array<[Address, Hex]> = candidatePools.map(({ pool }) => [\n this.voter,\n encodeFunctionData({ abi: poolToGaugeAbi, functionName: \"poolToGauge\", args: [pool] }),\n ]);\n gaugeResults = await multicallRead(this.rpcUrl, fallbackCalls);\n }\n\n // Filter to pools that have a gauge\n const gaugedCL: Array<{ pool: Address; gauge: Address; tokenA: Address; tokenB: Address; tickSpacing: number }> = [];\n for (let i = 0; i < candidatePools.length; i++) {\n const gauge = decodeAddress(gaugeResults[i] ?? null);\n if (gauge && gauge !== zeroAddress) {\n gaugedCL.push({ ...candidatePools[i]!, gauge });\n }\n }\n\n if (gaugedCL.length === 0) return;\n\n // Fetch token0/token1 from pool to get correct ordering, then symbols\n const tokenAddrsInPools = new Set<Address>();\n for (const { tokenA, tokenB } of gaugedCL) {\n tokenAddrsInPools.add(tokenA);\n tokenAddrsInPools.add(tokenB);\n }\n const uniqueTokens = Array.from(tokenAddrsInPools);\n const symbolCalls: Array<[Address, Hex]> = uniqueTokens.map((t) => [\n t,\n encodeFunctionData({ abi: erc20SymbolAbi, functionName: \"symbol\" }),\n ]);\n const symbolResults = await multicallRead(this.rpcUrl, symbolCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeSymbol(symbolResults[i] ?? null));\n }\n\n // Also try to read actual token0/token1 ordering from the pool contract\n const poolTokenCalls: Array<[Address, Hex]> = [];\n for (const { pool } of gaugedCL) {\n poolTokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token0\" })]);\n poolTokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token1\" })]);\n }\n const poolTokenResults = await multicallRead(this.rpcUrl, poolTokenCalls);\n\n for (let i = 0; i < gaugedCL.length; i++) {\n const { pool, gauge, tokenA, tokenB, tickSpacing } = gaugedCL[i]!;\n const rawT0 = decodeAddress(poolTokenResults[i * 2] ?? null);\n const rawT1 = decodeAddress(poolTokenResults[i * 2 + 1] ?? null);\n const t0 = rawT0 && rawT0 !== zeroAddress ? rawT0 : tokenA;\n const t1 = rawT1 && rawT1 !== zeroAddress ? rawT1 : tokenB;\n out.push({\n pool,\n gauge,\n token0: symbolMap.get(t0) ?? t0.slice(0, 10),\n token1: symbolMap.get(t1) ?? t1.slice(0, 10),\n token0Addr: t0,\n token1Addr: t1,\n type: \"CL\",\n tickSpacing,\n });\n }\n }\n\n // IGauge\n\n async buildDeposit(gauge: Address, amount: bigint, tokenId?: bigint, lpToken?: Address): Promise<DeFiTx> {\n // CL gauge (Aerodrome Slipstream / Velodrome CL): NFT-based deposit(tokenId) + NFT.approve pre-tx\n if (this.clNftMode && tokenId !== undefined && this.positionManager) {\n const nftAbi = parseAbi([\"function approve(address to, uint256 tokenId) external\"]);\n const clGaugeAbi = parseAbi([\"function deposit(uint256 tokenId) external\"]);\n const approveTx: DeFiTx = {\n description: `[${this.protocolName}] Approve LP NFT #${tokenId} to gauge`,\n to: this.positionManager,\n data: encodeFunctionData({ abi: nftAbi, functionName: \"approve\", args: [gauge, tokenId] }),\n value: 0n,\n gas_estimate: 80_000,\n };\n return {\n description: `[${this.protocolName}] Deposit LP NFT #${tokenId} to CL gauge`,\n to: gauge,\n data: encodeFunctionData({ abi: clGaugeAbi, functionName: \"deposit\", args: [tokenId] }),\n value: 0n,\n gas_estimate: 900_000,\n pre_txs: [approveTx],\n };\n }\n if (tokenId !== undefined) {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"depositFor\",\n args: [amount, tokenId],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to gauge (boost veNFT #${tokenId})`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: lpToken ? [{ token: lpToken, spender: gauge, amount }] : undefined,\n };\n }\n\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"deposit\",\n args: [amount],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to gauge`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: lpToken ? [{ token: lpToken, spender: gauge, amount }] : undefined,\n };\n }\n\n async buildWithdraw(gauge: Address, amount: bigint, tokenId?: bigint): Promise<DeFiTx> {\n // CL gauge: withdraw(tokenId) returns the LP NFT to the user\n if (this.clNftMode && tokenId !== undefined) {\n const clGaugeAbi = parseAbi([\"function withdraw(uint256 tokenId) external\"]);\n return {\n description: `[${this.protocolName}] Withdraw LP NFT #${tokenId} from CL gauge`,\n to: gauge,\n data: encodeFunctionData({ abi: clGaugeAbi, functionName: \"withdraw\", args: [tokenId] }),\n value: 0n,\n gas_estimate: 600_000,\n };\n }\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"withdraw\",\n args: [amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from gauge`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Resolve gauge address from a pool address via voter contract.\n * Tries gaugeForPool (Ramses), poolToGauge (NEST), gauges (classic Solidly).\n */\n async resolveGauge(pool: Address): Promise<Address> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for gauge lookup\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n for (const fn of [\"gaugeForPool\", \"poolToGauge\", \"gauges\"] as const) {\n try {\n const gauge = await client.readContract({\n address: this.voter,\n abi: voterAbi,\n functionName: fn,\n args: [pool],\n }) as Address;\n if (gauge !== zeroAddress) return gauge;\n } catch {\n // try next\n }\n }\n throw new DefiError(\"CONTRACT_ERROR\", `[${this.protocolName}] No gauge found for pool ${pool}`);\n }\n\n /**\n * Discover reward tokens for a gauge.\n * Returns { tokens, multiToken } where multiToken indicates getReward(account, tokens[]) support.\n */\n private async discoverRewardTokens(gauge: Address): Promise<{ tokens: Address[]; multiToken: boolean }> {\n if (!this.rpcUrl) return { tokens: [], multiToken: false };\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // 1. Try rewardsListLength — multi-token gauges (Ramses style)\n try {\n const len = await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"rewardsListLength\",\n }) as bigint;\n\n if (Number(len) > 0) {\n // Discover via rewardData for known HyperEVM tokens\n const candidates: Address[] = [\n \"0x5555555555555555555555555555555555555555\", // WHYPE\n \"0x555570a286F15EbDFE42B66eDE2f724Aa1AB5555\", // xRAM\n \"0x067b0C72aa4C6Bd3BFEFfF443c536DCd6a25a9C8\", // HYBR\n \"0x07c57E32a3C29D5659bda1d3EFC2E7BF004E3035\", // NEST token\n ];\n const found: Address[] = [];\n for (const token of candidates) {\n try {\n const rd = await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"rewardData\",\n args: [token],\n }) as readonly [bigint, bigint, bigint, bigint];\n if (rd[0] > 0n || rd[1] > 0n) found.push(token);\n } catch { /* not a reward */ }\n }\n if (found.length > 0) return { tokens: found, multiToken: true };\n return { tokens: [], multiToken: true }; // has rewards but couldn't enumerate\n }\n } catch {\n // no rewardsListLength\n }\n\n // 2. Fallback: rewardToken() — single-reward gauges (NEST / Hybra style)\n try {\n const rt = await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"rewardToken\",\n }) as Address;\n if (rt !== zeroAddress) return { tokens: [rt], multiToken: false };\n } catch { /* no rewardToken */ }\n\n return { tokens: [], multiToken: false };\n }\n\n async buildClaimRewards(gauge: Address, account?: Address): Promise<DeFiTx> {\n if (!this.rpcUrl || !account) {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [account ?? zeroAddress],\n });\n return { description: `[${this.protocolName}] Claim gauge rewards`, to: gauge, data, value: 0n, gas_estimate: 200_000 };\n }\n\n const { tokens, multiToken } = await this.discoverRewardTokens(gauge);\n\n // Multi-token gauge (Ramses): getReward(account, tokens[])\n if (multiToken && tokens.length > 0) {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [account, tokens],\n });\n return {\n description: `[${this.protocolName}] Claim gauge rewards (${tokens.length} tokens)`,\n to: gauge, data, value: 0n, gas_estimate: 300_000,\n };\n }\n\n // Single-token gauge: try getReward(account) first (Aerodrome / Velodrome / standard Solidly v2),\n // fall back to no-arg getReward() if that simulates as revert (NEST-style).\n const accountVariant = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [account],\n });\n try {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n await client.call({ account, to: gauge, data: accountVariant });\n return {\n description: `[${this.protocolName}] Claim gauge rewards (getReward(account))`,\n to: gauge, data: accountVariant, value: 0n, gas_estimate: 200_000,\n };\n } catch {\n const noArg = encodeFunctionData({ abi: gaugeAbi, functionName: \"getReward\", args: [] });\n return {\n description: `[${this.protocolName}] Claim gauge rewards (getReward())`,\n to: gauge, data: noArg, value: 0n, gas_estimate: 200_000,\n };\n }\n }\n\n /**\n * Claim rewards for a CL gauge by NFT tokenId (Hybra V4 style — single-arg getReward(tokenId)).\n */\n async buildClaimRewardsByTokenId(gauge: Address, tokenId: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim gauge rewards for NFT #${tokenId}`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n /**\n * Ramses-CL claim via NPM.getPeriodReward — the user-facing claim path.\n * The gauge contract restricts `getReward*` to authorized claimers (voter + NPM only);\n * EOAs must route through NPM, which calls into the gauge with msg.sender = NPM.\n *\n * ABI: getPeriodReward(uint256 period, uint256 tokenId, address[] tokens, address receiver)\n * `period` defaults to current Solidly weekly epoch index (block.timestamp / 604800).\n * `tokens` defaults to gauge.getRewardTokens() when `gauge` is provided.\n *\n * Verified 2026-04-29 on anvil fork: NPM.getPeriodReward(2938, 177068, [..., xRAM], wallet)\n * delivered 71.11 xRAM after 1h emission warp; direct gauge.getReward(...) reverts\n * with NOT_AUTHORIZED_CLAIMER for the same EOA.\n */\n async buildClaimRewardsViaNPMPeriodReward(\n npm: Address,\n tokenId: bigint,\n receiver: Address,\n opts?: { tokens?: Address[]; gauge?: Address; period?: bigint },\n ): Promise<DeFiTx> {\n let rewardTokens = opts?.tokens;\n if (!rewardTokens || rewardTokens.length === 0) {\n if (!opts?.gauge) {\n throw DefiError.invalidParam(\n \"Ramses CL claim requires either `tokens` or `gauge` (for getRewardTokens lookup)\",\n );\n }\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required to discover reward tokens\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n try {\n rewardTokens = await client.readContract({\n address: opts.gauge, abi: gaugeAbi, functionName: \"getRewardTokens\",\n }) as Address[];\n } catch {\n throw DefiError.contractError(\n `[${this.protocolName}] gauge.getRewardTokens() reverted — pass tokens[] explicitly`,\n );\n }\n }\n if (rewardTokens.length === 0) {\n throw DefiError.contractError(`[${this.protocolName}] no reward tokens to claim`);\n }\n const epochSeconds = 604800n;\n const period = opts?.period ?? (BigInt(Math.floor(Date.now() / 1000)) / epochSeconds);\n\n const npmClaimAbi = parseAbi([\n \"function getPeriodReward(uint256 period, uint256 tokenId, address[] tokens, address receiver) external\",\n ]);\n const data = encodeFunctionData({\n abi: npmClaimAbi,\n functionName: \"getPeriodReward\",\n args: [period, tokenId, rewardTokens, receiver],\n });\n return {\n description: `[${this.protocolName}] Claim via NPM.getPeriodReward(period=${period}, tokenId=${tokenId}, ${rewardTokens.length} tokens)`,\n to: npm,\n data,\n value: 0n,\n gas_estimate: 600_000,\n };\n }\n\n /**\n * @deprecated Direct gauge.getReward(tokenId, tokens[]) reverts with NOT_AUTHORIZED_CLAIMER\n * for EOAs on Ramses CL. Use buildClaimRewardsViaNPMPeriodReward instead.\n */\n async buildClaimRewardsByCLTokenIdMulti(\n gauge: Address,\n tokenId: bigint,\n tokens?: Address[],\n ): Promise<DeFiTx> {\n let rewardTokens = tokens;\n if (!rewardTokens || rewardTokens.length === 0) {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required to discover reward tokens\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n try {\n rewardTokens = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"getRewardTokens\",\n }) as Address[];\n } catch {\n throw DefiError.contractError(\n `[${this.protocolName}] gauge.getRewardTokens() reverted — pass tokens[] explicitly`,\n );\n }\n }\n if (rewardTokens.length === 0) {\n throw DefiError.contractError(`[${this.protocolName}] no reward tokens to claim`);\n }\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [tokenId, rewardTokens],\n });\n return {\n description: `[${this.protocolName}] Claim CL gauge rewards for NFT #${tokenId} (${rewardTokens.length} tokens)`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n /**\n * Ramses-CL-style pending rewards: earned(token, tokenId) per reward token from\n * gauge.getRewardTokens(). Returns raw amounts; caller resolves USD value.\n */\n async getPendingRewardsByCLTokenIdMulti(\n gauge: Address,\n tokenId: bigint,\n ): Promise<RewardInfo[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n let rewardTokens: Address[];\n try {\n rewardTokens = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"getRewardTokens\",\n }) as Address[];\n } catch {\n return [];\n }\n const out: RewardInfo[] = [];\n for (const token of rewardTokens) {\n try {\n const amount = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [token, tokenId],\n }) as bigint;\n out.push({ token, symbol: token.slice(0, 10), amount });\n } catch { /* skip token-tokenId pair that reverts */ }\n }\n return out;\n }\n\n async getPendingRewards(gauge: Address, user: Address): Promise<RewardInfo[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const results: RewardInfo[] = [];\n\n const { tokens, multiToken } = await this.discoverRewardTokens(gauge);\n\n if (multiToken && tokens.length > 0) {\n for (const token of tokens) {\n try {\n const earned = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [token, user],\n }) as bigint;\n results.push({ token, symbol: token.slice(0, 10), amount: earned });\n } catch { /* skip */ }\n }\n } else if (tokens.length > 0) {\n // Single-token gauge: earned(account)\n try {\n const earned = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [user],\n }) as bigint;\n results.push({ token: tokens[0]!, symbol: tokens[0]!.slice(0, 10), amount: earned });\n } catch { /* skip */ }\n } else {\n try {\n const earned = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [user],\n }) as bigint;\n results.push({ token: zeroAddress as Address, symbol: \"unknown\", amount: earned });\n } catch { /* skip */ }\n }\n\n return results;\n }\n\n /**\n * Get pending rewards for a CL gauge NFT position (Hybra V4 style).\n */\n async getPendingRewardsByTokenId(gauge: Address, tokenId: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"earned\",\n args: [tokenId],\n }) as bigint;\n }\n\n /**\n * Get pending rewards for an Aerodrome Slipstream CL gauge NFT position.\n * Uses the earned(address account, uint256 tokenId) overload, which is required\n * for CL gauges — the single-param earned(address) reverts on these contracts.\n */\n async getPendingRewardsByCLTokenId(gauge: Address, user: Address, tokenId: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"earned\",\n args: [user, tokenId],\n }) as bigint;\n }\n\n // IVoteEscrow\n\n async buildCreateLock(amount: bigint, lockDuration: number): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"create_lock\",\n args: [amount, BigInt(lockDuration)],\n });\n return {\n description: `[${this.protocolName}] Create veNFT lock: ${amount} tokens for ${lockDuration}s`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildIncreaseAmount(tokenId: bigint, amount: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"increase_amount\",\n args: [tokenId, amount],\n });\n return {\n description: `[${this.protocolName}] Increase veNFT #${tokenId} by ${amount}`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildIncreaseUnlockTime(tokenId: bigint, lockDuration: number): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"increase_unlock_time\",\n args: [tokenId, BigInt(lockDuration)],\n });\n return {\n description: `[${this.protocolName}] Extend veNFT #${tokenId} lock by ${lockDuration}s`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildWithdrawExpired(tokenId: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"withdraw\",\n args: [tokenId],\n });\n return {\n description: `[${this.protocolName}] Withdraw expired veNFT #${tokenId}`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n // IVoter\n\n async buildVote(tokenId: bigint, pools: Address[], weights: bigint[]): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"vote\",\n args: [tokenId, pools, weights],\n });\n return {\n description: `[${this.protocolName}] Vote with veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 500_000,\n };\n }\n\n async buildClaimBribes(bribes: Address[], tokenId: bigint): Promise<DeFiTx> {\n // claimBribes needs token arrays per bribe contract — simplified version\n const tokensPerBribe: Address[][] = bribes.map(() => []);\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"claimBribes\",\n args: [bribes, tokensPerBribe, tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim bribes for veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildClaimFees(fees: Address[], tokenId: bigint): Promise<DeFiTx> {\n const tokensPerFee: Address[][] = fees.map(() => []);\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"claimFees\",\n args: [fees, tokensPerFee, tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim trading fees for veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IGauge,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst masterchefAbi = parseAbi([\n \"function deposit(uint256 pid, uint256 amount) external\",\n \"function withdraw(uint256 pid, uint256 amount) external\",\n \"function claim(uint256[] calldata pids) external\",\n \"function pendingRewards(address account, uint256[] calldata pids) view returns (uint256[] memory moeRewards)\",\n \"function getNumberOfFarms() view returns (uint256)\",\n \"function getPidByPool(address pool) view returns (uint256)\",\n]);\n\nexport class MasterChefAdapter implements IGauge {\n private readonly protocolName: string;\n private readonly masterchef: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const masterchef = entry.contracts?.[\"masterchef\"];\n if (!masterchef) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'masterchef' contract\");\n }\n this.masterchef = masterchef;\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n /**\n * Deposit LP tokens into a MasterChef farm.\n * `gauge` is the pool address (unused for calldata — MasterChef is the target).\n * `tokenId` carries the farm pid.\n */\n async buildDeposit(gauge: Address, amount: bigint, tokenId?: bigint): Promise<DeFiTx> {\n const pid = tokenId ?? 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"deposit\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Withdraw LP tokens from a MasterChef farm.\n * `gauge` is used to look up the pid description only; call site should pass pid via tokenId\n * on the deposit flow. Here pid defaults to 0 — callers should encode the pid in the gauge\n * address slot or wrap this adapter with a pid-aware helper.\n */\n async buildWithdraw(gauge: Address, amount: bigint): Promise<DeFiTx> {\n // IGauge interface does not carry tokenId on withdraw; default pid=0.\n // Callers that need a specific pid should call buildWithdrawPid directly.\n const pid = 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"withdraw\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Withdraw LP tokens specifying a pid explicitly (MasterChef extension beyond IGauge). */\n async buildWithdrawPid(pid: bigint, amount: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"withdraw\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from farm pid=${pid}`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Claim pending MOE rewards. IGauge interface provides no pid — defaults to pid=0. */\n async buildClaimRewards(gauge: Address): Promise<DeFiTx> {\n const pid = 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"claim\",\n args: [[pid]],\n });\n return {\n description: `[${this.protocolName}] Claim MOE rewards for farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Claim pending MOE rewards for a specific pid (MasterChef extension beyond IGauge). */\n async buildClaimRewardsPid(pid: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"claim\",\n args: [[pid]],\n });\n return {\n description: `[${this.protocolName}] Claim MOE rewards for farm pid=${pid}`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Get pending MOE rewards for a user. Requires rpcUrl. */\n async getPendingRewards(_gauge: Address, user: Address): Promise<RewardInfo[]> {\n if (!this.rpcUrl) {\n throw DefiError.unsupported(`[${this.protocolName}] getPendingRewards requires RPC`);\n }\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const rewards = await client.readContract({\n address: this.masterchef,\n abi: masterchefAbi,\n functionName: \"pendingRewards\",\n args: [user, [0n]],\n });\n return (rewards as bigint[]).map((amount) => ({\n token: this.masterchef,\n symbol: \"MOE\",\n amount,\n }));\n }\n}\n","import {\n encodeFunctionData,\n decodeFunctionResult,\n parseAbi,\n createPublicClient,\n http,\n} from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type { ProtocolEntry, DeFiTx, RewardInfo } from \"@hypurrquant/defi-core\";\n\n// ============================================================\n// ABIs\n// ============================================================\n\nconst lbRouterAbi = parseAbi([\n \"struct LiquidityParameters { address tokenX; address tokenY; uint256 binStep; uint256 amountX; uint256 amountY; uint256 amountXMin; uint256 amountYMin; uint256 activeIdDesired; uint256 idSlippage; int256[] deltaIds; uint256[] distributionX; uint256[] distributionY; address to; address refundTo; uint256 deadline; }\",\n \"function addLiquidity(LiquidityParameters calldata liquidityParameters) external returns (uint256 amountXAdded, uint256 amountYAdded, uint256 amountXLeft, uint256 amountYLeft, uint256[] memory depositIds, uint256[] memory liquidityMinted)\",\n \"function removeLiquidity(address tokenX, address tokenY, uint16 binStep, uint256 amountXMin, uint256 amountYMin, uint256[] memory ids, uint256[] memory amounts, address to, uint256 deadline) external returns (uint256 amountX, uint256 amountY)\",\n]);\n\nconst lbFactoryAbi = parseAbi([\n \"function getNumberOfLBPairs() external view returns (uint256)\",\n \"function getLBPairAtIndex(uint256 index) external view returns (address)\",\n]);\n\nconst lbPairAbi = parseAbi([\n \"function getLBHooksParameters() external view returns (bytes32)\",\n \"function getActiveId() external view returns (uint24)\",\n \"function getBinStep() external view returns (uint16)\",\n \"function getTokenX() external view returns (address)\",\n \"function getTokenY() external view returns (address)\",\n \"function balanceOf(address account, uint256 id) external view returns (uint256)\",\n \"function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory)\",\n]);\n\nconst lbRewarderAbi = parseAbi([\n \"function getRewardToken() external view returns (address)\",\n \"function getRewardedRange() external view returns (uint256 minBinId, uint256 maxBinId)\",\n \"function getPendingRewards(address user, uint256[] calldata ids) external view returns (uint256 pendingRewards)\",\n \"function claim(address user, uint256[] calldata ids) external\",\n \"function getPid() external view returns (uint256)\",\n \"function isStopped() external view returns (bool)\",\n \"function getLBPair() external view returns (address)\",\n \"function getMasterChef() external view returns (address)\",\n]);\n\nconst masterChefAbi = parseAbi([\n \"function getMoePerSecond() external view returns (uint256)\",\n \"function getTreasuryShare() external view returns (uint256)\",\n \"function getStaticShare() external view returns (uint256)\",\n \"function getVeMoe() external view returns (address)\",\n]);\n\nconst veMoeAbi = parseAbi([\n \"function getWeight(uint256 pid) external view returns (uint256)\",\n \"function getTotalWeight() external view returns (uint256)\",\n \"function getTopPoolIds() external view returns (uint256[] memory)\",\n]);\n\nconst lbPairBinAbi = parseAbi([\n \"function getBin(uint24 id) external view returns (uint128 reserveX, uint128 reserveY)\",\n \"function getActiveId() external view returns (uint24)\",\n]);\n\nconst lbQuoterAbi = parseAbi([\n \"function findBestPathFromAmountIn(address[] calldata route, uint128 amountIn) external view returns ((address[] route, address[] pairs, uint256[] binSteps, uint256[] versions, uint128[] amounts, uint128[] virtualAmountsWithoutSlippage, uint128[] fees))\",\n]);\n\nconst erc20Abi = parseAbi([\n \"function symbol() external view returns (string)\",\n \"function balanceOf(address account) external view returns (uint256)\",\n]);\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface LBAddLiquidityParams {\n pool: Address;\n tokenX: Address;\n tokenY: Address;\n binStep: number;\n amountX: bigint;\n amountY: bigint;\n /** Number of bins on each side of active bin to distribute across (default: 5) */\n numBins?: number;\n /** Active bin id desired (defaults to on-chain query if rpcUrl provided) */\n activeIdDesired?: number;\n recipient: Address;\n deadline?: bigint;\n}\n\nexport interface LBRemoveLiquidityParams {\n tokenX: Address;\n tokenY: Address;\n binStep: number;\n binIds: number[];\n /** Amount of LB tokens to remove per bin (in order matching binIds) */\n amounts: bigint[];\n amountXMin?: bigint;\n amountYMin?: bigint;\n recipient: Address;\n deadline?: bigint;\n}\n\nexport interface LBPosition {\n binId: number;\n balance: bigint;\n}\n\nexport interface RewardedPool {\n pool: Address;\n rewarder: Address;\n rewardToken: Address;\n minBinId: number;\n maxBinId: number;\n pid: number;\n stopped: boolean;\n tokenX: Address;\n tokenY: Address;\n symbolX: string;\n symbolY: string;\n isTopPool: boolean;\n moePerDay: number;\n rangeTvlUsd: number;\n poolTvlUsd: number;\n aprPercent: number;\n rewardedBins: number;\n /** Global: total net MOE/day flowing to all dynamic pools */\n totalMoePerDay?: number;\n moePriceUsd?: number;\n}\n\n// ============================================================\n// Helpers\n// ============================================================\n\n/** Decode address using a generic address ABI */\nconst _addressAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddressResult(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\n/** Decode uint256 from multicall returnData */\nconst _uint256Abi = parseAbi([\"function f() external view returns (uint256)\"]);\nfunction decodeUint256Result(data: Hex | null): bigint | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _uint256Abi, functionName: \"f\", data }) as bigint;\n } catch {\n return null;\n }\n}\n\n/** Decode bool from multicall returnData */\nconst _boolAbi = parseAbi([\"function f() external view returns (bool)\"]);\nfunction decodeBoolResult(data: Hex | null): boolean | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _boolAbi, functionName: \"f\", data }) as boolean;\n } catch {\n return null;\n }\n}\n\n/** Decode string from multicall returnData */\nfunction decodeStringResult(data: Hex | null): string {\n if (!data) return \"?\";\n try {\n return decodeFunctionResult({ abi: erc20Abi, functionName: \"symbol\", data }) as string;\n } catch {\n return \"?\";\n }\n}\n\n/** Decode getRewardedRange (returns (uint256, uint256)) */\nconst _rangeAbi = parseAbi([\"function f() external view returns (uint256 minBinId, uint256 maxBinId)\"]);\nfunction decodeRangeResult(data: Hex | null): [bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _rangeAbi, functionName: \"f\", data }) as [bigint, bigint];\n } catch {\n return null;\n }\n}\n\n/** Decode getBin result (uint128, uint128) */\nconst _binAbi = parseAbi([\"function f() external view returns (uint128 reserveX, uint128 reserveY)\"]);\nfunction decodeBinResult(data: Hex | null): [bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _binAbi, functionName: \"f\", data }) as [bigint, bigint];\n } catch {\n return null;\n }\n}\n\n/** Decode uint256[] (e.g. getTopPoolIds) */\nconst _uint256ArrayAbi = parseAbi([\"function f() external view returns (uint256[] memory)\"]);\nfunction decodeUint256ArrayResult(data: Hex | null): bigint[] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _uint256ArrayAbi, functionName: \"f\", data }) as bigint[];\n } catch {\n return null;\n }\n}\n\n/** Extract rewarder address from LB hooks params (lower 20 bytes of bytes32) */\nfunction extractRewarderAddress(hooksParams: Hex): Address | null {\n // hooksParams is a 32-byte hex string (0x + 64 hex chars)\n if (!hooksParams || hooksParams === \"0x0000000000000000000000000000000000000000000000000000000000000000\") {\n return null;\n }\n // Lower 20 bytes = last 40 hex characters of the 64-char data portion\n const hex = hooksParams.slice(2); // strip 0x\n if (hex.length < 64) return null;\n const addrHex = hex.slice(24, 64); // bytes 12..31 = lower 20 bytes\n if (addrHex === \"0000000000000000000000000000000000000000\") return null;\n return `0x${addrHex}` as Address;\n}\n\n/** Build uniform distribution arrays for LB add liquidity.\n *\n * Distribution rules:\n * - Bins strictly below active: only tokenY (distributionX[i]=0, distributionY[i]=share)\n * - Bin at active: tokenX and tokenY split 50/50\n * - Bins strictly above active: only tokenX (distributionX[i]=share, distributionY[i]=0)\n *\n * distributionX / distributionY sum to 1e18 respectively.\n */\nfunction buildUniformDistribution(\n deltaIds: number[],\n): { distributionX: bigint[]; distributionY: bigint[] } {\n const PRECISION = 10n ** 18n;\n const n = deltaIds.length;\n\n // Count how many bins receive X and Y\n const xBins = deltaIds.filter((d) => d >= 0).length; // active + above\n const yBins = deltaIds.filter((d) => d <= 0).length; // active + below\n\n const distributionX: bigint[] = [];\n const distributionY: bigint[] = [];\n\n for (const delta of deltaIds) {\n // X share: bins at or above active\n const xShare = delta >= 0 && xBins > 0 ? PRECISION / BigInt(xBins) : 0n;\n // Y share: bins at or below active\n const yShare = delta <= 0 && yBins > 0 ? PRECISION / BigInt(yBins) : 0n;\n distributionX.push(xShare);\n distributionY.push(yShare);\n }\n\n // Correct rounding on the active bin (index where delta === 0)\n // The sum must be exactly PRECISION; adjust the first qualifying element\n const xSum = distributionX.reduce((a, b) => a + b, 0n);\n const ySum = distributionY.reduce((a, b) => a + b, 0n);\n if (xSum > 0n && xSum !== PRECISION) {\n const firstX = distributionX.findIndex((v) => v > 0n);\n if (firstX !== -1) distributionX[firstX] += PRECISION - xSum;\n }\n if (ySum > 0n && ySum !== PRECISION) {\n const firstY = distributionY.findIndex((v) => v > 0n);\n if (firstY !== -1) distributionY[firstY] += PRECISION - ySum;\n }\n\n return { distributionX, distributionY };\n}\n\n// ============================================================\n// Adapter\n// ============================================================\n\nexport class MerchantMoeLBAdapter {\n private readonly protocolName: string;\n private readonly lbRouter: Address;\n private readonly lbFactory: Address;\n private readonly lbQuoter?: Address;\n private readonly rpcUrl?: string;\n /** WMNT address (lb_mid_wmnt in config) used for MOE price routing */\n private readonly wmnt?: Address;\n /** USDT address (lb_mid_usdt in config) used for MNT/USD price routing */\n private readonly usdt?: Address;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const lbRouter = entry.contracts?.[\"lb_router\"];\n if (!lbRouter) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'lb_router' contract address\");\n }\n const lbFactory = entry.contracts?.[\"lb_factory\"];\n if (!lbFactory) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'lb_factory' contract address\");\n }\n this.lbRouter = lbRouter;\n this.lbFactory = lbFactory;\n this.lbQuoter = entry.contracts?.[\"lb_quoter\"];\n this.wmnt = entry.contracts?.[\"lb_mid_wmnt\"];\n this.usdt = entry.contracts?.[\"lb_mid_usdt\"];\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n private requireRpc(): string {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(`[${this.protocolName}] RPC URL required`);\n }\n return this.rpcUrl;\n }\n\n /**\n * Build an addLiquidity transaction for a Liquidity Book pair.\n * Distributes tokenX/tokenY uniformly across active bin ± numBins.\n */\n async buildAddLiquidity(params: LBAddLiquidityParams): Promise<DeFiTx> {\n const numBins = params.numBins ?? 5;\n const deadline = params.deadline ?? BigInt(\"18446744073709551615\");\n\n // Resolve active bin id\n let activeIdDesired = params.activeIdDesired;\n if (activeIdDesired === undefined) {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n const activeId = await client.readContract({\n address: params.pool,\n abi: lbPairAbi,\n functionName: \"getActiveId\",\n });\n activeIdDesired = activeId as number;\n }\n\n // Build delta IDs: [-numBins, ..., -1, 0, 1, ..., numBins]\n const deltaIds: number[] = [];\n for (let d = -numBins; d <= numBins; d++) {\n deltaIds.push(d);\n }\n\n const { distributionX, distributionY } = buildUniformDistribution(deltaIds);\n\n const data = encodeFunctionData({\n abi: lbRouterAbi,\n functionName: \"addLiquidity\",\n args: [\n {\n tokenX: params.tokenX,\n tokenY: params.tokenY,\n binStep: BigInt(params.binStep),\n amountX: params.amountX,\n amountY: params.amountY,\n amountXMin: 0n,\n amountYMin: 0n,\n activeIdDesired: BigInt(activeIdDesired),\n idSlippage: BigInt(numBins + 2),\n deltaIds: deltaIds.map(BigInt),\n distributionX,\n distributionY,\n to: params.recipient,\n refundTo: params.recipient,\n deadline,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] LB addLiquidity ${params.amountX} tokenX + ${params.amountY} tokenY across ${deltaIds.length} bins`,\n to: this.lbRouter,\n data,\n value: 0n,\n gas_estimate: 800_000,\n approvals: [\n { token: params.tokenX, spender: this.lbRouter, amount: params.amountX },\n { token: params.tokenY, spender: this.lbRouter, amount: params.amountY },\n ],\n };\n }\n\n /**\n * Build a removeLiquidity transaction for specific LB bins.\n */\n async buildRemoveLiquidity(params: LBRemoveLiquidityParams): Promise<DeFiTx> {\n const deadline = params.deadline ?? BigInt(\"18446744073709551615\");\n\n const data = encodeFunctionData({\n abi: lbRouterAbi,\n functionName: \"removeLiquidity\",\n args: [\n params.tokenX,\n params.tokenY,\n params.binStep,\n params.amountXMin ?? 0n,\n params.amountYMin ?? 0n,\n params.binIds.map(BigInt),\n params.amounts,\n params.recipient,\n deadline,\n ],\n });\n\n return {\n description: `[${this.protocolName}] LB removeLiquidity from ${params.binIds.length} bins`,\n to: this.lbRouter,\n data,\n value: 0n,\n gas_estimate: 600_000,\n };\n }\n\n /**\n * Auto-detect bin IDs for a pool from the rewarder's rewarded range.\n * Falls back to active bin ± 50 scan if no rewarder exists.\n */\n private async autoDetectBins(pool: Address): Promise<number[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const hooksParams = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getLBHooksParameters\",\n }) as Hex;\n\n const rewarder = extractRewarderAddress(hooksParams);\n if (rewarder) {\n const range = await client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getRewardedRange\",\n }) as [bigint, bigint];\n const min = Number(range[0]);\n const max = Number(range[1]);\n const ids: number[] = [];\n for (let b = min; b <= max; b++) ids.push(b);\n return ids;\n }\n\n // No rewarder: scan active bin ± 50\n const activeId = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getActiveId\",\n }) as number;\n const ids: number[] = [];\n for (let b = activeId - 50; b <= activeId + 50; b++) ids.push(b);\n return ids;\n }\n\n /**\n * Get pending MOE rewards for a user across specified bin IDs.\n * If binIds is omitted, auto-detects from the rewarder's rewarded range.\n * Reads the rewarder address from the pool's hooks parameters.\n */\n async getPendingRewards(user: Address, pool: Address, binIds?: number[]): Promise<RewardInfo[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const hooksParams = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getLBHooksParameters\",\n }) as Hex;\n\n const rewarder = extractRewarderAddress(hooksParams);\n if (!rewarder) {\n return [];\n }\n\n // Auto-detect bins from rewarder range if not provided\n let resolvedBinIds = binIds;\n if (!resolvedBinIds || resolvedBinIds.length === 0) {\n const range = await client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getRewardedRange\",\n }) as [bigint, bigint];\n const min = Number(range[0]);\n const max = Number(range[1]);\n resolvedBinIds = [];\n for (let b = min; b <= max; b++) resolvedBinIds.push(b);\n }\n\n const [pending, rewardToken] = await Promise.all([\n client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getPendingRewards\",\n args: [user, resolvedBinIds.map(BigInt)],\n }),\n client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getRewardToken\",\n }),\n ]);\n\n return [\n {\n token: rewardToken as Address,\n symbol: \"MOE\",\n amount: pending as bigint,\n },\n ];\n }\n\n /**\n * Scan ±scanRange bins around the active bin and return the user's non-zero balance bin IDs.\n * Critical: the rewarder may track pending rewards for bins OUTSIDE its current rewarded range\n * (e.g. when the rewarded range shifts after a position was already in place). Always claim\n * against the user's actual positions, not the rewarder's \"current\" range.\n */\n async findUserBinsWithBalance(pool: Address, user: Address, scanRange = 50): Promise<number[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n const activeId = await client.readContract({\n address: pool, abi: lbPairAbi, functionName: \"getActiveId\",\n }) as number;\n const calls: Array<[Address, Hex]> = [];\n const binIds: number[] = [];\n for (let b = activeId - scanRange; b <= activeId + scanRange; b++) {\n binIds.push(b);\n calls.push([pool, encodeFunctionData({\n abi: parseAbi([\"function balanceOf(address account, uint256 id) view returns (uint256)\"]),\n functionName: \"balanceOf\",\n args: [user, BigInt(b)],\n })]);\n }\n const results = await multicallRead(rpcUrl, calls);\n const owned: number[] = [];\n for (let i = 0; i < binIds.length; i++) {\n const data = results[i];\n if (!data) continue;\n // Decode uint256 — non-zero last 32 bytes means user has balance in this bin\n const hex = data.slice(2).padStart(64, \"0\");\n if (hex !== \"0\".repeat(64)) owned.push(binIds[i]!);\n }\n return owned;\n }\n\n /**\n * Build a claim rewards transaction for specific LB bins.\n * If binIds is omitted, auto-detects from the user's actual non-zero balance bins (active ±50 scan).\n * This catches rewards accumulated in bins outside the rewarder's current rewarded range.\n */\n async buildClaimRewards(user: Address, pool: Address, binIds?: number[]): Promise<DeFiTx> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const hooksParams = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getLBHooksParameters\",\n }) as Hex;\n\n const rewarder = extractRewarderAddress(hooksParams);\n if (!rewarder) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${this.protocolName}] Pool ${pool} has no active rewarder`);\n }\n\n let resolvedBinIds = binIds;\n if (!resolvedBinIds || resolvedBinIds.length === 0) {\n // Prefer user's actual non-zero bins over rewarder's current range — the rewarder\n // may track pending rewards across bins where the user was previously LP'd.\n resolvedBinIds = await this.findUserBinsWithBalance(pool, user);\n if (resolvedBinIds.length === 0) {\n // Fallback: rewarder's current range (no user position case)\n const range = await client.readContract({\n address: rewarder, abi: lbRewarderAbi, functionName: \"getRewardedRange\",\n }) as [bigint, bigint];\n const min = Number(range[0]);\n const max = Number(range[1]);\n resolvedBinIds = [];\n for (let b = min; b <= max; b++) resolvedBinIds.push(b);\n }\n }\n\n const data = encodeFunctionData({\n abi: lbRewarderAbi,\n functionName: \"claim\",\n args: [user, resolvedBinIds.map(BigInt)],\n });\n\n return {\n description: `[${this.protocolName}] LB claim rewards for ${resolvedBinIds.length} bins`,\n to: rewarder,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n /**\n * Discover all active rewarded LB pools by iterating the factory.\n * Uses 7 multicall batches to minimise RPC round-trips and avoid 429s.\n *\n * Batch 1: getNumberOfLBPairs(), then getLBPairAtIndex(i) for all i\n * Batch 2: getLBHooksParameters() for all pairs → extract rewarder addresses\n * Batch 3: isStopped/getRewardedRange/getRewardToken/getPid/getMasterChef for each rewarder\n * Batch 4: getTokenX/getTokenY for each rewarded pair, then symbol() for unique tokens\n * Batch 5: Bootstrap MasterChef→VeMoe, then getMoePerSecond/getTreasuryShare/getStaticShare/getTotalWeight/getTopPoolIds\n * Batch 6: VeMoe.getWeight(pid) for each rewarded pool\n * Batch 7: Pool.getBin(binId) for all bins in rewarded range of each pool\n * Price: LB Quoter findBestPathFromAmountIn for MOE/WMNT and WMNT/USDT prices\n */\n async discoverRewardedPools(): Promise<RewardedPool[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n // --- Batch 1a: get pair count ---\n const pairCount = await client.readContract({\n address: this.lbFactory,\n abi: lbFactoryAbi,\n functionName: \"getNumberOfLBPairs\",\n }) as bigint;\n\n const count = Number(pairCount);\n if (count === 0) return [];\n\n // --- Batch 1b: getLBPairAtIndex for all indices ---\n const batch1Calls: Array<[Address, Hex]> = Array.from({ length: count }, (_, i) => [\n this.lbFactory,\n encodeFunctionData({ abi: lbFactoryAbi, functionName: \"getLBPairAtIndex\", args: [BigInt(i)] }),\n ]);\n const batch1Results = await multicallRead(rpcUrl, batch1Calls);\n\n const pairAddresses: Address[] = batch1Results\n .map((r) => decodeAddressResult(r))\n .filter((a): a is Address => a !== null);\n\n if (pairAddresses.length === 0) return [];\n\n // --- Batch 2: getLBHooksParameters for all pairs ---\n const batch2Calls: Array<[Address, Hex]> = pairAddresses.map((pair) => [\n pair,\n encodeFunctionData({ abi: lbPairAbi, functionName: \"getLBHooksParameters\" }),\n ]);\n const batch2Results = await multicallRead(rpcUrl, batch2Calls);\n\n // Filter pairs with a rewarder\n const rewardedPairs: Array<{ pool: Address; rewarder: Address }> = [];\n for (let i = 0; i < pairAddresses.length; i++) {\n const raw = batch2Results[i];\n if (!raw) continue;\n // getLBHooksParameters returns bytes32 — decode as raw bytes32 value\n let hooksBytes: Hex;\n try {\n const _bytes32Abi = parseAbi([\"function f() external view returns (bytes32)\"]);\n hooksBytes = decodeFunctionResult({ abi: _bytes32Abi, functionName: \"f\", data: raw }) as Hex;\n } catch {\n continue;\n }\n const rewarder = extractRewarderAddress(hooksBytes);\n if (rewarder) {\n rewardedPairs.push({ pool: pairAddresses[i]!, rewarder });\n }\n }\n\n if (rewardedPairs.length === 0) return [];\n\n // --- Batch 3: rewarder details (5 calls per rewarder, interleaved) ---\n const batch3Calls: Array<[Address, Hex]> = [];\n for (const { rewarder } of rewardedPairs) {\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"isStopped\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getRewardedRange\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getRewardToken\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getPid\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getMasterChef\" })]);\n }\n const batch3Results = await multicallRead(rpcUrl, batch3Calls);\n\n // --- Batch 4a: getTokenX / getTokenY for rewarded pairs ---\n const batch4aCalls: Array<[Address, Hex]> = [];\n for (const { pool } of rewardedPairs) {\n batch4aCalls.push([pool, encodeFunctionData({ abi: lbPairAbi, functionName: \"getTokenX\" })]);\n batch4aCalls.push([pool, encodeFunctionData({ abi: lbPairAbi, functionName: \"getTokenY\" })]);\n }\n const batch4aResults = await multicallRead(rpcUrl, batch4aCalls);\n\n // Collect unique token addresses for symbol lookup\n const tokenXAddresses: Array<Address | null> = [];\n const tokenYAddresses: Array<Address | null> = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n tokenXAddresses.push(decodeAddressResult(batch4aResults[i * 2] ?? null));\n tokenYAddresses.push(decodeAddressResult(batch4aResults[i * 2 + 1] ?? null));\n }\n\n const uniqueTokens = Array.from(\n new Set([...tokenXAddresses, ...tokenYAddresses].filter((a): a is Address => a !== null)),\n );\n\n // --- Batch 4b: symbol() for each unique token ---\n const batch4bCalls: Array<[Address, Hex]> = uniqueTokens.map((token) => [\n token,\n encodeFunctionData({ abi: erc20Abi, functionName: \"symbol\" }),\n ]);\n const batch4bResults = await multicallRead(rpcUrl, batch4bCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeStringResult(batch4bResults[i] ?? null));\n }\n\n // Extract per-pool data from batch 3 (5 calls per rewarder)\n const STRIDE3 = 5;\n const poolData: Array<{\n stopped: boolean;\n range: [bigint, bigint] | null;\n rewardToken: Address | null;\n pid: number;\n masterChef: Address | null;\n }> = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const base = i * STRIDE3;\n poolData.push({\n stopped: decodeBoolResult(batch3Results[base] ?? null) ?? false,\n range: decodeRangeResult(batch3Results[base + 1] ?? null),\n rewardToken: decodeAddressResult(batch3Results[base + 2] ?? null),\n pid: Number(decodeUint256Result(batch3Results[base + 3] ?? null) ?? 0n),\n masterChef: decodeAddressResult(batch3Results[base + 4] ?? null),\n });\n }\n\n // --- Batch 5: Bootstrap MasterChef/VeMoe, then fetch global emission params ---\n // Find the first valid MasterChef address from the rewarders\n const masterChefAddr = poolData.map((d) => d.masterChef).find((a): a is Address => a !== null) ?? null;\n\n let moePerDay = 0;\n let topPoolIds = new Set<number>();\n let totalWeightRaw = 0n;\n let veMoeAddr: Address | null = null;\n\n if (masterChefAddr) {\n // First get VeMoe address from MasterChef\n veMoeAddr = await client.readContract({\n address: masterChefAddr,\n abi: masterChefAbi,\n functionName: \"getVeMoe\",\n }) as Address;\n\n // Batch 5: MasterChef global data + VeMoe global data\n const batch5Calls: Array<[Address, Hex]> = [\n [masterChefAddr, encodeFunctionData({ abi: masterChefAbi, functionName: \"getMoePerSecond\" })],\n [masterChefAddr, encodeFunctionData({ abi: masterChefAbi, functionName: \"getTreasuryShare\" })],\n [masterChefAddr, encodeFunctionData({ abi: masterChefAbi, functionName: \"getStaticShare\" })],\n [veMoeAddr, encodeFunctionData({ abi: veMoeAbi, functionName: \"getTotalWeight\" })],\n [veMoeAddr, encodeFunctionData({ abi: veMoeAbi, functionName: \"getTopPoolIds\" })],\n ];\n const batch5Results = await multicallRead(rpcUrl, batch5Calls);\n\n const moePerSecRaw = decodeUint256Result(batch5Results[0] ?? null) ?? 0n;\n const treasuryShareRaw = decodeUint256Result(batch5Results[1] ?? null) ?? 0n;\n const staticShareRaw = decodeUint256Result(batch5Results[2] ?? null) ?? 0n;\n totalWeightRaw = decodeUint256Result(batch5Results[3] ?? null) ?? 0n;\n const topPoolIdsRaw = decodeUint256ArrayResult(batch5Results[4] ?? null) ?? [];\n\n topPoolIds = new Set(topPoolIdsRaw.map(Number));\n\n // Shares are fixed-point 1e18 fractions\n const PRECISION = 10n ** 18n;\n // net_moe_per_sec = total × (1 - treasury) × (1 - static)\n // expressed in bigint arithmetic to avoid float truncation\n const netPerSec =\n (moePerSecRaw * (PRECISION - treasuryShareRaw) / PRECISION) *\n (PRECISION - staticShareRaw) / PRECISION;\n\n // Convert to human-readable MOE/day (MOE has 18 decimals)\n // This is the total net MOE/day that flows to dynamic (VeMoe) pools\n moePerDay = Number(netPerSec * 86400n) / 1e18;\n }\n\n // --- Batch 6: VeMoe.getWeight(pid) for each rewarded pool ---\n const weightByPid = new Map<number, bigint>();\n if (veMoeAddr && rewardedPairs.length > 0) {\n const batch6Calls: Array<[Address, Hex]> = poolData.map((d) => [\n veMoeAddr!,\n encodeFunctionData({ abi: veMoeAbi, functionName: \"getWeight\", args: [BigInt(d.pid)] }),\n ]);\n const batch6Results = await multicallRead(rpcUrl, batch6Calls);\n for (let i = 0; i < poolData.length; i++) {\n weightByPid.set(poolData[i]!.pid, decodeUint256Result(batch6Results[i] ?? null) ?? 0n);\n }\n }\n\n // --- Price: MOE and WMNT prices in USD via LB Quoter ---\n // Route: MOE → WMNT → USDT (MOE has 18 decimals, WMNT has 18, USDT has 6)\n let moePriceUsd = 0;\n let wmntPriceUsd = 0;\n const MOE_ADDR = \"0x4515A45337F461A11Ff0FE8aBF3c606AE5dC00c9\" as Address;\n if (this.lbQuoter && this.wmnt && this.usdt) {\n try {\n const [moeWmntQuote, wmntUsdtQuote] = await Promise.all([\n client.readContract({\n address: this.lbQuoter,\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [[MOE_ADDR, this.wmnt], 10n ** 18n],\n }),\n client.readContract({\n address: this.lbQuoter,\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [[this.wmnt, this.usdt], 10n ** 18n],\n }),\n ]);\n // amounts[last] is the output amount (USDT has 6 decimals, WMNT has 18)\n const moeInWmnt = Number((moeWmntQuote as unknown as { amounts: bigint[] }).amounts.at(-1) ?? 0n) / 1e18;\n wmntPriceUsd = Number((wmntUsdtQuote as unknown as { amounts: bigint[] }).amounts.at(-1) ?? 0n) / 1e6;\n moePriceUsd = moeInWmnt * wmntPriceUsd;\n } catch {\n // Price fetch failed — APR will be 0\n }\n }\n\n // --- Resolve token prices for all pool tokens ---\n const stableSymbols = new Set([\"USDT\", \"USDC\", \"USDT0\", \"MUSD\", \"AUSD\", \"USDY\", \"FDUSD\", \"USDe\", \"sUSDe\"]);\n const mntSymbols = new Set([\"WMNT\", \"MNT\"]);\n const moeSymbols = new Set([\"MOE\"]);\n const sixDecimalStables = new Set([\"USDT\", \"USDC\", \"USDT0\", \"FDUSD\"]);\n\n // Address-based price & decimals maps\n const tokenPriceMap = new Map<string, number>();\n const tokenDecimalsMap = new Map<string, number>();\n\n // Seed known prices by symbol\n for (const [addr, sym] of symbolMap) {\n const key = addr.toLowerCase();\n if (stableSymbols.has(sym)) { tokenPriceMap.set(key, 1); tokenDecimalsMap.set(key, sixDecimalStables.has(sym) ? 6 : 18); }\n else if (mntSymbols.has(sym)) { tokenPriceMap.set(key, wmntPriceUsd); tokenDecimalsMap.set(key, 18); }\n else if (moeSymbols.has(sym)) { tokenPriceMap.set(key, moePriceUsd); tokenDecimalsMap.set(key, 18); }\n }\n\n // Collect unknown tokens from rewarded pools\n const unknownTokenAddrs: Address[] = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n for (const addr of [tokenXAddresses[i], tokenYAddresses[i]]) {\n if (addr && !tokenPriceMap.has(addr.toLowerCase())) {\n if (!unknownTokenAddrs.some(a => a.toLowerCase() === addr.toLowerCase())) {\n unknownTokenAddrs.push(addr);\n }\n }\n }\n }\n\n // Query decimals + prices for unknown tokens via LB Quoter\n if (unknownTokenAddrs.length > 0 && this.lbQuoter && this.wmnt && wmntPriceUsd > 0) {\n const erc20DecimalsAbi = parseAbi([\"function decimals() external view returns (uint8)\"]);\n\n // Batch: query decimals for all unknown tokens\n const decCalls: Array<[Address, Hex]> = unknownTokenAddrs.map(addr => [\n addr,\n encodeFunctionData({ abi: erc20DecimalsAbi, functionName: \"decimals\" }),\n ]);\n const decResults = await multicallRead(rpcUrl, decCalls).catch(() => [] as (Hex | undefined)[]);\n for (let i = 0; i < unknownTokenAddrs.length; i++) {\n const dec = decResults[i] ? Number(decodeUint256Result(decResults[i]!) ?? 18n) : 18;\n tokenDecimalsMap.set(unknownTokenAddrs[i]!.toLowerCase(), dec);\n }\n\n // Quote each unknown token → WMNT in parallel\n // Use small amount (0.01 token) to minimize slippage on thin pools\n const quotePromises = unknownTokenAddrs.map(async (tokenAddr) => {\n try {\n const dec = tokenDecimalsMap.get(tokenAddr.toLowerCase()) ?? 18;\n const quoteUnit = 10n ** BigInt(Math.max(dec - 2, 0)); // 0.01 token\n const quote = await client.readContract({\n address: this.lbQuoter!,\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [[tokenAddr, this.wmnt!], quoteUnit as unknown as bigint & { __brand: \"uint128\" }],\n });\n const amountOut = ((quote as unknown as { amounts: bigint[] }).amounts?.at(-1)) ?? 0n;\n // Scale back: price per 1 token = amountOut / quoteUnit * 10^dec / 10^18\n const priceInWmnt = (Number(amountOut) / 1e18) * (10 ** dec / Number(quoteUnit));\n return { addr: tokenAddr, price: priceInWmnt * wmntPriceUsd };\n } catch {\n return { addr: tokenAddr, price: 0 };\n }\n });\n const priceResults = await Promise.all(quotePromises);\n for (const { addr, price } of priceResults) {\n if (price > 0) tokenPriceMap.set(addr.toLowerCase(), price);\n }\n }\n\n // Price/decimals lookup by address\n const getTokenPriceUsd = (_sym: string, addr: Address): number => {\n return tokenPriceMap.get(addr.toLowerCase()) ?? 0;\n };\n const getTokenDecimals = (_sym: string, addr: Address): number => {\n return tokenDecimalsMap.get(addr.toLowerCase()) ?? 18;\n };\n\n // --- Batch 7: Pool.getBin(binId) for all bins in rewarded range ---\n type BinRequest = { poolIdx: number; binId: number };\n const binRequests: BinRequest[] = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const range = poolData[i]!.range;\n if (!range) continue;\n const minBin = Number(range[0]);\n const maxBin = Number(range[1]);\n for (let b = minBin; b <= maxBin; b++) {\n binRequests.push({ poolIdx: i, binId: b });\n }\n }\n\n const binReservesX = new Map<number, Map<number, bigint>>();\n const binReservesY = new Map<number, Map<number, bigint>>();\n\n if (binRequests.length > 0) {\n const batch7Calls: Array<[Address, Hex]> = binRequests.map(({ poolIdx, binId }) => [\n rewardedPairs[poolIdx]!.pool,\n encodeFunctionData({ abi: lbPairBinAbi, functionName: \"getBin\", args: [binId] }),\n ]);\n const batch7Results = await multicallRead(rpcUrl, batch7Calls);\n\n for (let j = 0; j < binRequests.length; j++) {\n const { poolIdx, binId } = binRequests[j]!;\n const decoded = decodeBinResult(batch7Results[j] ?? null);\n if (!decoded) continue;\n if (!binReservesX.has(poolIdx)) {\n binReservesX.set(poolIdx, new Map());\n binReservesY.set(poolIdx, new Map());\n }\n binReservesX.get(poolIdx)!.set(binId, decoded[0]);\n binReservesY.get(poolIdx)!.set(binId, decoded[1]);\n }\n }\n\n // --- Batch 8: Full pool TVL via ERC20 balanceOf(pool) for tokenX and tokenY ---\n const poolBalanceX = new Map<number, bigint>();\n const poolBalanceY = new Map<number, bigint>();\n {\n const balCalls: Array<[Address, Hex]> = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const tx = tokenXAddresses[i];\n const ty = tokenYAddresses[i];\n const pool = rewardedPairs[i]!.pool;\n balCalls.push([tx ?? (\"0x0000000000000000000000000000000000000000\" as Address), encodeFunctionData({ abi: erc20Abi, functionName: \"balanceOf\", args: [pool] })]);\n balCalls.push([ty ?? (\"0x0000000000000000000000000000000000000000\" as Address), encodeFunctionData({ abi: erc20Abi, functionName: \"balanceOf\", args: [pool] })]);\n }\n const balResults = await multicallRead(rpcUrl, balCalls).catch(() => [] as (Hex | undefined)[]);\n for (let i = 0; i < rewardedPairs.length; i++) {\n poolBalanceX.set(i, decodeUint256Result(balResults[i * 2] ?? null) ?? 0n);\n poolBalanceY.set(i, decodeUint256Result(balResults[i * 2 + 1] ?? null) ?? 0n);\n }\n }\n\n const results: RewardedPool[] = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const { pool, rewarder } = rewardedPairs[i]!;\n const data = poolData[i]!;\n\n const tokenX = tokenXAddresses[i] ?? (\"0x0000000000000000000000000000000000000000\" as Address);\n const tokenY = tokenYAddresses[i] ?? (\"0x0000000000000000000000000000000000000000\" as Address);\n const symX = symbolMap.get(tokenX) ?? \"?\";\n const symY = symbolMap.get(tokenY) ?? \"?\";\n\n const isTopPool = topPoolIds.has(data.pid);\n const weight = weightByPid.get(data.pid) ?? 0n;\n\n // Pool's MOE/day = total_net_moe_per_day × weight / total_weight\n // Only top pools (in VeMoe top list) receive dynamic emissions\n let poolMoePerDay = 0;\n if (isTopPool && totalWeightRaw > 0n && weight > 0n) {\n poolMoePerDay = moePerDay * (Number(weight) / Number(totalWeightRaw));\n }\n\n // Range TVL: sum bin reserves × token prices\n const rxMap = binReservesX.get(i);\n const ryMap = binReservesY.get(i);\n const range = data.range;\n let rangeTvlUsd = 0;\n let rewardedBins = 0;\n\n if (range) {\n const minBin = Number(range[0]);\n const maxBin = Number(range[1]);\n rewardedBins = maxBin - minBin + 1;\n if (rxMap && ryMap) {\n const priceX = getTokenPriceUsd(symX, tokenX);\n const priceY = getTokenPriceUsd(symY, tokenY);\n const decX = getTokenDecimals(symX, tokenX);\n const decY = getTokenDecimals(symY, tokenY);\n for (let b = minBin; b <= maxBin; b++) {\n const rx = rxMap.get(b) ?? 0n;\n const ry = ryMap.get(b) ?? 0n;\n rangeTvlUsd += (Number(rx) / 10 ** decX) * priceX;\n rangeTvlUsd += (Number(ry) / 10 ** decY) * priceY;\n }\n }\n }\n\n // Full pool TVL from balanceOf\n const priceX = getTokenPriceUsd(symX, tokenX);\n const priceY = getTokenPriceUsd(symY, tokenY);\n const decX = getTokenDecimals(symX, tokenX);\n const decY = getTokenDecimals(symY, tokenY);\n const fullBalX = poolBalanceX.get(i) ?? 0n;\n const fullBalY = poolBalanceY.get(i) ?? 0n;\n const poolTvlUsd = (Number(fullBalX) / 10 ** decX) * priceX + (Number(fullBalY) / 10 ** decY) * priceY;\n\n // APR = (poolMoePerDay * moePriceUsd * 365) / rangeTvlUsd * 100\n const aprPercent =\n rangeTvlUsd > 0 && moePriceUsd > 0\n ? (poolMoePerDay * moePriceUsd * 365 / rangeTvlUsd) * 100\n : 0;\n\n results.push({\n pool,\n rewarder,\n rewardToken: data.rewardToken ?? (\"0x0000000000000000000000000000000000000000\" as Address),\n minBinId: range ? Number(range[0]) : 0,\n maxBinId: range ? Number(range[1]) : 0,\n pid: data.pid,\n stopped: data.stopped,\n tokenX,\n tokenY,\n symbolX: symX,\n symbolY: symY,\n isTopPool,\n moePerDay: poolMoePerDay,\n rangeTvlUsd,\n poolTvlUsd,\n aprPercent,\n rewardedBins,\n totalMoePerDay: moePerDay,\n moePriceUsd,\n });\n }\n\n return results;\n }\n\n /**\n * Get a user's LB positions (bin balances) across a range of bin IDs.\n * If binIds is omitted, auto-detects from the rewarder's rewarded range (or active ± 50).\n */\n async getUserPositions(user: Address, pool: Address, binIds?: number[]): Promise<LBPosition[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const resolvedBinIds = (binIds && binIds.length > 0) ? binIds : await this.autoDetectBins(pool);\n\n const accounts = resolvedBinIds.map(() => user);\n const ids = resolvedBinIds.map(BigInt);\n\n const balances = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"balanceOfBatch\",\n args: [accounts, ids],\n }) as bigint[];\n\n return resolvedBinIds\n .map((binId, i) => ({ binId, balance: balances[i] ?? 0n }))\n .filter((p) => p.balance > 0n);\n }\n}\n","import {\n decodeAbiParameters,\n encodeFunctionData,\n encodeAbiParameters,\n http,\n createPublicClient,\n keccak256,\n parseAbi,\n decodeFunctionResult,\n zeroAddress,\n} from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type { DeFiTx } from \"@hypurrquant/defi-core\";\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\n/** KITTEN reward token on Hyper EVM */\nconst KITTEN_TOKEN: Address = \"0x618275f8efe54c2afa87bfb9f210a52f0ff89364\";\n\n/** WHYPE bonus reward token */\nconst WHYPE_TOKEN: Address = \"0x5555555555555555555555555555555555555555\";\n\n/** Max nonce to scan when discovering incentive keys */\nconst MAX_NONCE_SCAN = 60;\n\n/** HyperEVM well-known token addresses for pool discovery (matches solidly_gauge.ts) */\nconst HYPEREVM_TOKENS: Address[] = [\n \"0x5555555555555555555555555555555555555555\", // WHYPE\n \"0xb88339CB7199b77E23DB6E890353E22632Ba630f\", // USDC\n \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", // USDT0\n \"0xBe6727B535545C67d5cAa73dEa54865B92CF7907\", // UETH\n \"0x9FDBdA0A5e284c32744D2f17Ee5c74B284993463\", // UBTC\n \"0x111111a1a0667d36bD57c0A9f569b98057111111\", // USDH\n \"0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34\", // USDe\n \"0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2\", // sUSDe\n \"0xf4D9235269a96aaDaFc9aDAe454a0618eBE37949\", // XAUt0\n \"0xfD739d4e423301CE9385c1fb8850539D657C296D\", // kHYPE\n KITTEN_TOKEN, // KITTEN\n];\n\n// ─── ABIs ─────────────────────────────────────────────────────────────────────\n\nconst farmingCenterAbi = parseAbi([\n \"function multicall(bytes[] calldata data) external payable returns (bytes[] memory results)\",\n \"function enterFarming((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external\",\n \"function exitFarming((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external\",\n \"function collectRewards((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external\",\n \"function claimReward(address rewardToken, address to, uint256 amountRequested) external returns (uint256 reward)\",\n]);\n\nconst positionManagerAbi = parseAbi([\n \"function approveForFarming(uint256 tokenId, bool approve, address farmingAddress) external\",\n \"function farmingApprovals(uint256 tokenId) external view returns (address)\",\n]);\n\nconst eternalFarmingAbi = parseAbi([\n \"function incentives(bytes32 incentiveId) external view returns (uint256 totalReward, uint256 bonusReward, address virtualPoolAddress, uint24 minimalPositionWidth, bool deactivated, address pluginAddress)\",\n \"function getRewardInfo((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external view returns (uint256 reward, uint256 bonusReward)\",\n]);\n\nconst algebraFactoryAbi = parseAbi([\n \"function poolByPair(address tokenA, address tokenB) external view returns (address pool)\",\n]);\n\n// Decode helpers\nconst _addressDecodeAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressDecodeAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface IncentiveKey {\n rewardToken: Address;\n bonusRewardToken: Address;\n pool: Address;\n nonce: bigint;\n}\n\nexport interface FarmingPool {\n pool: Address;\n key: IncentiveKey;\n totalReward: bigint;\n bonusReward: bigint;\n active: boolean;\n}\n\n// ─── Helper ───────────────────────────────────────────────────────────────────\n\n/** Compute the incentiveId hash for an IncentiveKey (keccak256(abi.encode(key))) */\nfunction incentiveId(key: IncentiveKey): Hex {\n return keccak256(\n encodeAbiParameters(\n [\n { name: \"rewardToken\", type: \"address\" },\n { name: \"bonusRewardToken\", type: \"address\" },\n { name: \"pool\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n [key.rewardToken, key.bonusRewardToken, key.pool, key.nonce],\n ),\n );\n}\n\n/** Build the enterFarming calldata (without selector overhead — for use inside multicall) */\nfunction encodeEnterFarming(key: IncentiveKey, tokenId: bigint): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"enterFarming\",\n args: [key, tokenId],\n });\n}\n\n/** Build the exitFarming calldata */\nfunction encodeExitFarming(key: IncentiveKey, tokenId: bigint): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"exitFarming\",\n args: [key, tokenId],\n });\n}\n\n/** Build the collectRewards calldata */\nfunction encodeCollectRewards(key: IncentiveKey, tokenId: bigint): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"collectRewards\",\n args: [key, tokenId],\n });\n}\n\n/** Build the claimReward calldata */\nfunction encodeClaimReward(rewardToken: Address, to: Address): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"claimReward\",\n args: [rewardToken, to, 2n ** 256n - 1n], // max uint256 (KittenSwap variant uses uint256 amount, not uint128)\n });\n}\n\n/** Encode the top-level multicall wrapping an array of calldatas */\nfunction encodeMulticall(calls: Hex[]): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"multicall\",\n args: [calls],\n });\n}\n\n// ─── Runtime cache ───────────────────────────────────────────────────────────\n\n/** Runtime cache: pool (lowercased) → discovered nonce. Avoids repeated scans within a session. */\nconst nonceCache = new Map<string, bigint>();\n\n// ─── Adapter ──────────────────────────────────────────────────────────────────\n\nexport class KittenSwapFarmingAdapter {\n private readonly protocolName: string;\n private readonly farmingCenter: Address;\n private readonly eternalFarming: Address;\n private readonly positionManager: Address;\n private readonly rpcUrl: string;\n private readonly factory: Address | undefined;\n private readonly rewardToken: Address;\n private readonly bonusRewardToken: Address;\n\n constructor(\n protocolName: string,\n farmingCenter: Address,\n eternalFarming: Address,\n positionManager: Address,\n rpcUrl: string,\n factory?: Address,\n rewardToken: Address = KITTEN_TOKEN,\n bonusRewardToken: Address = WHYPE_TOKEN,\n ) {\n this.protocolName = protocolName;\n this.farmingCenter = farmingCenter;\n this.eternalFarming = eternalFarming;\n this.positionManager = positionManager;\n this.rpcUrl = rpcUrl;\n this.factory = factory;\n this.rewardToken = rewardToken;\n this.bonusRewardToken = bonusRewardToken;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n /**\n * Discover the active IncentiveKey for a given pool.\n * 1. Check runtime cache\n * 2. Batch-query nonces 0-60 via single multicall (61 calls)\n * 3. Return first non-zero incentive (totalReward > 0 and not deactivated)\n */\n async discoverIncentiveKey(pool: Address): Promise<IncentiveKey | null> {\n const poolLc = pool.toLowerCase();\n\n // Fast path: runtime cache\n if (nonceCache.has(poolLc)) {\n return {\n rewardToken: this.rewardToken,\n bonusRewardToken: this.bonusRewardToken,\n pool,\n nonce: nonceCache.get(poolLc)!,\n };\n }\n\n // Build 61 multicall calls for nonces 0-60\n const calls: Array<[Address, Hex]> = [];\n const nonces: bigint[] = [];\n for (let n = 0; n <= MAX_NONCE_SCAN; n++) {\n const nonce = BigInt(n);\n nonces.push(nonce);\n const key: IncentiveKey = {\n rewardToken: this.rewardToken,\n bonusRewardToken: this.bonusRewardToken,\n pool,\n nonce,\n };\n calls.push([\n this.eternalFarming,\n encodeFunctionData({\n abi: eternalFarmingAbi,\n functionName: \"incentives\",\n args: [incentiveId(key)],\n }),\n ]);\n }\n\n const results = await multicallRead(this.rpcUrl, calls);\n\n for (let i = 0; i < results.length; i++) {\n const data = results[i];\n if (!data || data.length < 66) continue;\n\n try {\n const decoded = decodeAbiParameters(\n [\n { name: \"totalReward\", type: \"uint256\" },\n { name: \"bonusReward\", type: \"uint256\" },\n { name: \"virtualPoolAddress\", type: \"address\" },\n { name: \"minimalPositionWidth\", type: \"uint24\" },\n { name: \"deactivated\", type: \"bool\" },\n { name: \"pluginAddress\", type: \"address\" },\n ],\n data,\n );\n\n const totalReward = decoded[0] as bigint;\n const deactivated = decoded[4] as boolean;\n\n if (totalReward > 0n && !deactivated) {\n const nonce = nonces[i]!;\n nonceCache.set(poolLc, nonce);\n return {\n rewardToken: this.rewardToken,\n bonusRewardToken: this.bonusRewardToken,\n pool,\n nonce,\n };\n }\n } catch {\n // skip decode errors\n }\n }\n\n return null;\n }\n\n /**\n * Build approveForFarming tx on the PositionManager.\n * Required before enterFarming if not already approved.\n */\n async buildApproveForFarming(tokenId: bigint): Promise<DeFiTx | null> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const currentApproval = await client.readContract({\n address: this.positionManager,\n abi: positionManagerAbi,\n functionName: \"farmingApprovals\",\n args: [tokenId],\n }) as Address;\n\n if (currentApproval.toLowerCase() === this.farmingCenter.toLowerCase()) {\n return null; // Already approved\n }\n\n return {\n description: `[${this.protocolName}] Approve NFT #${tokenId} for farming`,\n to: this.positionManager,\n data: encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"approveForFarming\",\n args: [tokenId, true, this.farmingCenter],\n }),\n value: 0n,\n gas_estimate: 60_000,\n };\n }\n\n /**\n * Build enterFarming tx for a position NFT.\n * Checks farming approval first and returns pre_txs if needed.\n */\n async buildEnterFarming(\n tokenId: bigint,\n pool: Address,\n _owner: Address,\n ): Promise<DeFiTx> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n throw new DefiError(\n \"CONTRACT_ERROR\",\n `[${this.protocolName}] No active incentive found for pool ${pool}`,\n );\n }\n\n const approveTx = await this.buildApproveForFarming(tokenId);\n\n return {\n description: `[${this.protocolName}] Enter farming for NFT #${tokenId} in pool ${pool}`,\n to: this.farmingCenter,\n data: encodeEnterFarming(key, tokenId),\n value: 0n,\n gas_estimate: 400_000,\n pre_txs: approveTx ? [approveTx] : undefined,\n };\n }\n\n /**\n * Build a tx that exits farming for a position NFT (unstakes).\n */\n async buildExitFarming(tokenId: bigint, pool: Address): Promise<DeFiTx> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n throw new DefiError(\n \"CONTRACT_ERROR\",\n `[${this.protocolName}] No active incentive found for pool ${pool}`,\n );\n }\n\n return {\n description: `[${this.protocolName}] Exit farming for NFT #${tokenId} in pool ${pool}`,\n to: this.farmingCenter,\n data: encodeExitFarming(key, tokenId),\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n /**\n * Build a multicall tx that collects rewards for a staked position and claims them.\n * Pattern: multicall([collectRewards(key, tokenId), claimReward(KITTEN, owner, max), claimReward(WHYPE, owner, max)])\n */\n async buildCollectRewards(\n tokenId: bigint,\n pool: Address,\n owner: Address,\n ): Promise<DeFiTx> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n throw new DefiError(\n \"CONTRACT_ERROR\",\n `[${this.protocolName}] No active incentive found for pool ${pool}`,\n );\n }\n\n const calls: Hex[] = [\n encodeCollectRewards(key, tokenId),\n encodeClaimReward(this.rewardToken, owner),\n encodeClaimReward(this.bonusRewardToken, owner),\n ];\n\n return {\n description: `[${this.protocolName}] Collect + claim rewards for NFT #${tokenId} in pool ${pool}`,\n to: this.farmingCenter,\n data: encodeMulticall(calls),\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n /**\n * Build a tx that only claims already-accumulated rewards (no position change needed).\n */\n async buildClaimReward(owner: Address): Promise<DeFiTx> {\n const calls: Hex[] = [\n encodeClaimReward(this.rewardToken, owner),\n encodeClaimReward(this.bonusRewardToken, owner),\n ];\n\n return {\n description: `[${this.protocolName}] Claim KITTEN + WHYPE farming rewards to ${owner}`,\n to: this.farmingCenter,\n data: encodeMulticall(calls),\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Query pending rewards for a staked position NFT.\n */\n async getPendingRewards(\n tokenId: bigint,\n pool: Address,\n ): Promise<{ reward: bigint; bonusReward: bigint }> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n return { reward: 0n, bonusReward: 0n };\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const result = await client.readContract({\n address: this.eternalFarming,\n abi: eternalFarmingAbi,\n functionName: \"getRewardInfo\",\n args: [key, tokenId],\n }) as readonly [bigint, bigint];\n\n return { reward: result[0], bonusReward: result[1] };\n }\n\n /**\n * Discover all KittenSwap pools with active farming incentives.\n *\n * Steps:\n * 1. Generate all unique token pair combos from HYPEREVM_TOKENS (includes KITTEN)\n * 2. Batch poolByPair calls via multicall against the Algebra factory\n * 3. For each found pool, batch-scan nonces 0-60 via multicall\n * 4. Return enriched FarmingPool[] for pools with active incentives\n */\n async discoverFarmingPools(): Promise<FarmingPool[]> {\n if (!this.factory) {\n return [];\n }\n\n // Step 1: generate all unique token pairs\n const pairs: Array<[Address, Address]> = [];\n for (let i = 0; i < HYPEREVM_TOKENS.length; i++) {\n for (let j = i + 1; j < HYPEREVM_TOKENS.length; j++) {\n pairs.push([HYPEREVM_TOKENS[i]!, HYPEREVM_TOKENS[j]!]);\n }\n }\n\n // Step 2: batch poolByPair calls\n const poolByPairCalls: Array<[Address, Hex]> = pairs.map(([tokenA, tokenB]) => [\n this.factory!,\n encodeFunctionData({\n abi: algebraFactoryAbi,\n functionName: \"poolByPair\",\n args: [tokenA, tokenB],\n }),\n ]);\n\n const poolResults = await multicallRead(this.rpcUrl, poolByPairCalls);\n\n // Collect unique non-zero pool addresses\n const poolSet = new Set<string>();\n for (const data of poolResults) {\n const addr = decodeAddress(data);\n if (addr && addr !== zeroAddress) {\n poolSet.add(addr.toLowerCase());\n }\n }\n\n if (poolSet.size === 0) return [];\n\n const pools = Array.from(poolSet) as Address[];\n\n // Step 3: for each pool, batch-scan nonces 0-60 via a single multicall per pool.\n // We build all nonce calls for all pools in one big multicall to minimize RPC round-trips.\n const NONCE_COUNT = MAX_NONCE_SCAN + 1; // 61\n const allNonceCalls: Array<[Address, Hex]> = [];\n for (const pool of pools) {\n for (let n = 0; n <= MAX_NONCE_SCAN; n++) {\n const key: IncentiveKey = {\n rewardToken: this.rewardToken,\n bonusRewardToken: this.bonusRewardToken,\n pool: pool as Address,\n nonce: BigInt(n),\n };\n allNonceCalls.push([\n this.eternalFarming,\n encodeFunctionData({\n abi: eternalFarmingAbi,\n functionName: \"incentives\",\n args: [incentiveId(key)],\n }),\n ]);\n }\n }\n\n const allNonceResults = await multicallRead(this.rpcUrl, allNonceCalls);\n\n // Step 4: find best active incentive per pool and build result\n const results: FarmingPool[] = [];\n\n for (let pi = 0; pi < pools.length; pi++) {\n const pool = pools[pi]! as Address;\n const poolLc = pool.toLowerCase();\n const base = pi * NONCE_COUNT;\n\n let bestKey: IncentiveKey | null = null;\n let bestTotalReward = 0n;\n let bestBonusReward = 0n;\n let bestActive = false;\n\n for (let n = 0; n <= MAX_NONCE_SCAN; n++) {\n const data = allNonceResults[base + n];\n if (!data || data.length < 66) continue;\n\n try {\n const decoded = decodeAbiParameters(\n [\n { name: \"totalReward\", type: \"uint256\" },\n { name: \"bonusReward\", type: \"uint256\" },\n { name: \"virtualPoolAddress\", type: \"address\" },\n { name: \"minimalPositionWidth\", type: \"uint24\" },\n { name: \"deactivated\", type: \"bool\" },\n { name: \"pluginAddress\", type: \"address\" },\n ],\n data,\n );\n\n const totalReward = decoded[0] as bigint;\n const bonusReward = decoded[1] as bigint;\n const deactivated = decoded[4] as boolean;\n\n if (totalReward > 0n) {\n const nonce = BigInt(n);\n const isActive = !deactivated;\n\n // Prefer active incentives; among active ones, prefer higher nonce (newer)\n if (!bestKey || (isActive && !bestActive) || (isActive === bestActive && nonce > bestKey.nonce)) {\n bestKey = {\n rewardToken: this.rewardToken,\n bonusRewardToken: this.bonusRewardToken,\n pool,\n nonce,\n };\n bestTotalReward = totalReward;\n bestBonusReward = bonusReward;\n bestActive = isActive;\n }\n }\n } catch {\n // skip decode errors\n }\n }\n\n if (bestKey) {\n // Cache the discovered nonce\n nonceCache.set(poolLc, bestKey.nonce);\n results.push({\n pool,\n key: bestKey,\n totalReward: bestTotalReward,\n bonusReward: bestBonusReward,\n active: bestActive,\n });\n }\n }\n\n return results;\n }\n}\n","import { DefiError, type ProtocolEntry, type RewardInfo, type DeFiTx } from \"@hypurrquant/defi-core\";\nimport type { Address, Hex } from \"viem\";\n\nconst DEFAULT_BASE_URL = \"https://app.usenest.xyz/api/blaze\";\nconst FALLBACK_BASE_URL = \"https://blaze.nest.aegas.it\";\n\nconst NEST_TOKEN: Address = \"0x07c57E32a3C29D5659bda1d3EFC2E7BF004E3035\";\nconst NEST_DECIMALS = 18;\n\nexport interface NestClaimStatus {\n totalClaimedRaw: bigint;\n totalAvailableRaw: bigint;\n pendingRaw: bigint;\n pendingFormatted: number;\n}\n\nexport interface NestClaimTicket {\n user: Address;\n amount: bigint;\n timestamp: bigint;\n day: bigint | null;\n signature: Hex;\n}\n\nexport interface NestAprEstimateParams {\n poolAddress: Address;\n minTick: number;\n maxTick: number;\n token0Amount: bigint;\n token1Amount: bigint;\n}\n\nexport class NestOffChainAdapter {\n private readonly baseUrl: string;\n private readonly fallbackUrl: string;\n private readonly voter: Address;\n\n constructor(entry: ProtocolEntry) {\n const voter = entry.contracts?.[\"voter\"];\n if (!voter) {\n throw DefiError.contractError(\"Nest off-chain: missing 'voter' contract\");\n }\n this.voter = voter;\n this.baseUrl = process.env[\"NEST_API_URL\"] ?? DEFAULT_BASE_URL;\n this.fallbackUrl = FALLBACK_BASE_URL;\n }\n\n name(): string {\n return \"Nest\";\n }\n\n /** Cumulative claimed + available NEST emissions for a wallet */\n async getClaimStatus(wallet: Address): Promise<NestClaimStatus> {\n const data = await this.fetchJson<{ totalClaimed: string; totalAvailable: string }>(\n `/claim/claim-status?publicAddress=${wallet}`,\n );\n const totalClaimedRaw = BigInt(data.totalClaimed);\n const totalAvailableRaw = BigInt(data.totalAvailable);\n const pendingRaw = totalAvailableRaw > totalClaimedRaw\n ? totalAvailableRaw - totalClaimedRaw\n : 0n;\n return {\n totalClaimedRaw,\n totalAvailableRaw,\n pendingRaw,\n pendingFormatted: Number(pendingRaw) / 10 ** NEST_DECIMALS,\n };\n }\n\n /**\n * Backend-signed claim ticket (or null when nothing to claim).\n * Returns the raw ticket; `buildClaim()` is not yet implemented because the\n * voter contract source is unverified — function selector 0xd6d7a454 takes\n * 5 dynamic arrays we have not been able to disambiguate yet.\n */\n async getClaimTicket(wallet: Address): Promise<NestClaimTicket | null> {\n const url = `${this.baseUrl}/claim/claim-data?publicAddress=${wallet}`;\n const res = await fetch(url, this.requestInit());\n const text = await res.text();\n if (text.includes(\"no points to claim\")) return null;\n if (!res.ok) {\n throw DefiError.providerError(`Nest claim-data ${res.status}: ${text.slice(0, 200)}`);\n }\n let json: { user: string; amount: string; timestamp: string; day: string | null; signature: string };\n try {\n json = JSON.parse(text);\n } catch {\n throw DefiError.providerError(`Nest claim-data: non-JSON response: ${text.slice(0, 200)}`);\n }\n return {\n user: json.user as Address,\n amount: BigInt(json.amount),\n timestamp: BigInt(json.timestamp),\n day: json.day === null ? null : BigInt(json.day),\n signature: (json.signature.startsWith(\"0x\") ? json.signature : `0x${json.signature}`) as Hex,\n };\n }\n\n /** APR estimate (percent) for a CL position with given tick range and amounts */\n async estimateLpApr(params: NestAprEstimateParams): Promise<number> {\n const qs = new URLSearchParams({\n poolAddress: params.poolAddress,\n minTick: String(params.minTick),\n maxTick: String(params.maxTick),\n token0Amount: params.token0Amount.toString(),\n token1Amount: params.token1Amount.toString(),\n });\n const data = await this.fetchJson<{ apr: string }>(`/liquidity/apr/estimate?${qs}`);\n const apr = Number(data.apr);\n if (!Number.isFinite(apr)) {\n throw DefiError.providerError(`Nest apr/estimate: invalid apr value '${data.apr}'`);\n }\n return apr;\n }\n\n /** Pending NEST emissions as IGauge-compatible RewardInfo[] */\n async getPendingRewards(user: Address): Promise<RewardInfo[]> {\n const status = await this.getClaimStatus(user);\n if (status.pendingRaw === 0n) return [];\n return [{\n token: NEST_TOKEN,\n symbol: \"NEST\",\n amount: status.pendingRaw,\n }];\n }\n\n /** Voter address used by aggregateClaim() — exposed for callers that build the tx themselves */\n getVoterAddress(): Address {\n return this.voter;\n }\n\n /**\n * Build a Nest voter claim transaction by reproducing the byte-level calldata\n * pattern observed in successful onchain claims, swapping in the ticket's\n * (amount, timestamp, signature) words.\n *\n * The voter implementation source is not verified, so we cannot derive a\n * Solidity ABI for selector 0xd6d7a454. Instead, two known-successful claim\n * transactions were diffed:\n *\n * tx1: 0x99f35cfdb6fc3885ebe046c4625acc083e42d5afe6ca6962c6c81cd9006b99ba\n * tx2: 0x3e120ab95e9e0a9148cb8964993dd066b8a36363353fe727462231857724e7bb\n *\n * 31 of 34 calldata words are identical between the two; only words 21, 22,\n * 25, 26, 27 differ — and those map exactly to the backend ticket's\n * (amount, timestamp, sigR, sigS, sigVPadded). msg.sender is not encoded in\n * calldata; voter binds the claim to the caller, so the ticket signature\n * authorizes the EOA holding the wallet.\n *\n * Throws if no claim ticket is available.\n */\n async buildClaim(wallet: Address): Promise<DeFiTx> {\n const ticket = await this.getClaimTicket(wallet);\n if (!ticket) {\n throw DefiError.invalidParam(`Nest: no claim ticket available for ${wallet}`);\n }\n\n // Decompose the 65-byte signature into r (32) || s (32) || v (1)\n const sigHex = ticket.signature.startsWith(\"0x\") ? ticket.signature.slice(2) : ticket.signature;\n if (sigHex.length !== 130) {\n throw DefiError.providerError(`Nest: signature must be 65 bytes (130 hex chars), got ${sigHex.length}`);\n }\n const r = sigHex.slice(0, 64);\n const s = sigHex.slice(64, 128);\n const v = sigHex.slice(128, 130);\n const vPadded = v + \"0\".repeat(62); // last word: v in high byte + 31 zero bytes\n\n const amountHex = ticket.amount.toString(16).padStart(64, \"0\");\n const timestampHex = ticket.timestamp.toString(16).padStart(64, \"0\");\n\n // Calldata template: 34 words, derived from two verified onchain claim txs.\n // Mutable slots (ticket struct): 21=amount, 22=timestamp, 25=sigR, 26=sigS, 27=sigV+padding.\n const words = [\n \"0000000000000000000000000000000000000000000000000000000000000160\", // 0\n \"0000000000000000000000000000000000000000000000000000000000000180\", // 1\n \"0000000000000000000000000000000000000000000000000000000000000200\", // 2\n \"00000000000000000000000000000000000000000000000000000000000002a0\", // 3\n \"0000000000000000000000000000000000000000000000000000000000000380\", // 4\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 5\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 6\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 7\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 8\n \"0000000000000000000000000000000000000000000000000000000000000001\", // 9\n \"0000000000000000000000000000000000000000000000000000000000000001\", // 10\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 11 — empty array length\n \"0000000000000000000000000000000000000000000000000000000000000040\", // 12\n \"0000000000000000000000000000000000000000000000000000000000000060\", // 13\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 14\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 15\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 16\n \"0000000000000000000000000000000000000000000000000000000000000060\", // 17\n \"0000000000000000000000000000000000000000000000000000000000000080\", // 18\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 19\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 20\n amountHex, // 21 — ticket amount\n timestampHex, // 22 — ticket timestamp\n \"0000000000000000000000000000000000000000000000000000000000000060\", // 23 — sig offset\n \"0000000000000000000000000000000000000000000000000000000000000041\", // 24 — sig length (65)\n r, // 25 — sig r\n s, // 26 — sig s\n vPadded, // 27 — sig v + zero padding\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 28\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 29\n \"0000000000000000000000000000000000000000000000000000000000000001\", // 30\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 31\n \"00000000000000000000000000000000000000000000000000000000000000a0\", // 32\n \"0000000000000000000000000000000000000000000000000000000000000000\", // 33\n ];\n const data = (\"0xd6d7a454\" + words.join(\"\")) as Hex;\n\n return {\n description: `[${this.name()}] Claim NEST emissions (${(Number(ticket.amount) / 1e18).toFixed(2)} NEST cumulative; backend-signed ts=${ticket.timestamp})`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 600_000,\n };\n }\n\n // ── internal ──\n\n private async fetchJson<T>(path: string): Promise<T> {\n const primary = `${this.baseUrl}${path.startsWith(\"/claim\") ? path : path}`;\n try {\n const res = await fetch(primary, this.requestInit());\n if (res.ok) return await res.json() as T;\n if (res.status >= 500) throw new Error(`upstream ${res.status}`);\n throw DefiError.providerError(`Nest API ${res.status}: ${(await res.text()).slice(0, 200)}`);\n } catch (e) {\n if (this.baseUrl === this.fallbackUrl) throw e;\n const fallback = `${this.fallbackUrl}${path}`;\n const res = await fetch(fallback, this.requestInit());\n if (!res.ok) {\n throw DefiError.providerError(`Nest fallback ${res.status}: ${(await res.text()).slice(0, 200)}`);\n }\n return await res.json() as T;\n }\n }\n\n private requestInit(): RequestInit {\n return { headers: { \"User-Agent\": \"defi-cli/0.5\", \"Accept\": \"application/json\" } };\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, decodeFunctionResult, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n multicallRead,\n decodeU256,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n InterestRateMode,\n} from \"@hypurrquant/defi-core\";\n\nconst POOL_ABI = parseAbi([\n \"function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external\",\n \"function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf) external\",\n \"function repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) external returns (uint256)\",\n \"function withdraw(address asset, uint256 amount, address to) external returns (uint256)\",\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n \"function getReserveData(address asset) external view returns (uint256 configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nconst INCENTIVES_ABI = parseAbi([\n \"function getIncentivesController() external view returns (address)\",\n]);\n\nconst REWARDS_CONTROLLER_ABI = parseAbi([\n \"function getRewardsByAsset(address asset) external view returns (address[])\",\n \"function getRewardsData(address asset, address reward) external view returns (uint256 index, uint256 emissionsPerSecond, uint256 lastUpdateTimestamp, uint256 distributionEnd)\",\n]);\n\nconst POOL_PROVIDER_ABI = parseAbi([\n \"function ADDRESSES_PROVIDER() external view returns (address)\",\n]);\n\nconst ADDRESSES_PROVIDER_ABI = parseAbi([\n \"function getPriceOracle() external view returns (address)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n \"function BASE_CURRENCY_UNIT() external view returns (uint256)\",\n]);\n\nconst ERC20_DECIMALS_ABI = parseAbi([\n \"function decimals() external view returns (uint8)\",\n]);\n\nfunction u256ToF64(v: bigint): number {\n const MAX_U128 = (1n << 128n) - 1n;\n if (v > MAX_U128) return Infinity;\n return Number(v);\n}\n\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data || data.length < 66) return null;\n // ABI-encoded address: 12 bytes padding + 20 bytes address (total 32 bytes = 64 hex chars + 0x)\n return `0x${data.slice(26, 66)}` as Address;\n}\n\nfunction decodeAddressArray(data: Hex | null): Address[] {\n if (!data) return [];\n try {\n return decodeFunctionResult({\n abi: REWARDS_CONTROLLER_ABI,\n functionName: \"getRewardsByAsset\",\n data,\n }) as Address[];\n } catch {\n return [];\n }\n}\n\nfunction decodeReserveData(data: Hex | null): ReturnType<typeof decodeFunctionResult> | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n data,\n });\n } catch {\n return null;\n }\n}\n\nfunction decodeRewardsData(data: Hex | null): [bigint, bigint, bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: REWARDS_CONTROLLER_ABI,\n functionName: \"getRewardsData\",\n data,\n }) as [bigint, bigint, bigint, bigint];\n } catch {\n return null;\n }\n}\n\nexport class AaveV3Adapter implements ILending {\n private readonly protocolName: string;\n private readonly pool: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const pool = entry.contracts?.[\"pool\"];\n if (!pool) throw DefiError.contractError(`[${entry.name}] Missing 'pool' contract address`);\n this.pool = pool;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount, params.on_behalf_of, 0],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"borrow\",\n args: [params.asset, params.amount, rateMode, 0, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"repay\",\n args: [params.asset, params.amount, rateMode, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n\n // Batch 1: getReserveData\n const reserveCallData = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n args: [asset],\n });\n const [reserveRaw] = await multicallRead(this.rpcUrl, [\n [this.pool, reserveCallData],\n ]).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData failed: ${e}`);\n });\n\n const reserveDecoded = decodeReserveData(reserveRaw ?? null);\n if (!reserveDecoded) {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData returned no data`);\n }\n const result = reserveDecoded as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, Address, Address, Address, Address, bigint, bigint, bigint];\n\n const RAY = 1e27;\n const SECONDS_PER_YEAR = 31536000;\n\n // Convert ray rate to APY: ((1 + rate/SECONDS_PER_YEAR)^SECONDS_PER_YEAR - 1) * 100\n const toApy = (rayRate: bigint): number => {\n const rate = Number(rayRate) / RAY;\n return (Math.pow(1 + rate / SECONDS_PER_YEAR, SECONDS_PER_YEAR) - 1) * 100;\n };\n\n const supplyRate = toApy(result[2]);\n const variableRate = toApy(result[4]);\n const stableRate = toApy(result[5]);\n\n const aTokenAddress = result[8] as Address;\n const variableDebtTokenAddress = result[10] as Address;\n\n // Batch 2: totalSupply for aToken + variableDebtToken\n const [supplyRaw, borrowRaw] = await multicallRead(this.rpcUrl, [\n [aTokenAddress, encodeFunctionData({ abi: ERC20_ABI, functionName: \"totalSupply\" })],\n [variableDebtTokenAddress, encodeFunctionData({ abi: ERC20_ABI, functionName: \"totalSupply\" })],\n ]);\n const totalSupply = decodeU256(supplyRaw ?? null);\n const totalBorrow = decodeU256(borrowRaw ?? null);\n\n const utilization = totalSupply > 0n\n ? Number((totalBorrow * 10000n) / totalSupply) / 100\n : 0;\n\n // Fetch incentive/reward data (best-effort, never breaks base rates)\n const supplyRewardTokens: string[] = [];\n const borrowRewardTokens: string[] = [];\n const supplyEmissions: string[] = [];\n const borrowEmissions: string[] = [];\n\n try {\n // Batch 3: getIncentivesController (single call)\n const [controllerRaw] = await multicallRead(this.rpcUrl, [\n [aTokenAddress, encodeFunctionData({ abi: INCENTIVES_ABI, functionName: \"getIncentivesController\" })],\n ]);\n const controllerAddr = decodeAddress(controllerRaw ?? null);\n\n if (controllerAddr && controllerAddr !== zeroAddress) {\n // Batch 4: getRewardsByAsset for aToken + variableDebtToken\n const [supplyRewardsRaw, borrowRewardsRaw] = await multicallRead(this.rpcUrl, [\n [controllerAddr, encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsByAsset\", args: [aTokenAddress] })],\n [controllerAddr, encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsByAsset\", args: [variableDebtTokenAddress] })],\n ]);\n const supplyRewards = decodeAddressArray(supplyRewardsRaw ?? null);\n const borrowRewards = decodeAddressArray(borrowRewardsRaw ?? null);\n\n // Batch 5: all getRewardsData calls for supply + borrow combined\n const rewardsDataCalls: Array<[Address, Hex]> = [\n ...supplyRewards.map((reward): [Address, Hex] => [\n controllerAddr,\n encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsData\", args: [aTokenAddress, reward] }),\n ]),\n ...borrowRewards.map((reward): [Address, Hex] => [\n controllerAddr,\n encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsData\", args: [variableDebtTokenAddress, reward] }),\n ]),\n ];\n\n if (rewardsDataCalls.length > 0) {\n const rewardsDataResults = await multicallRead(this.rpcUrl, rewardsDataCalls);\n\n const supplyDataResults = rewardsDataResults.slice(0, supplyRewards.length);\n const borrowDataResults = rewardsDataResults.slice(supplyRewards.length);\n\n for (let i = 0; i < supplyRewards.length; i++) {\n const data = decodeRewardsData(supplyDataResults[i] ?? null);\n if (data && data[1] > 0n) {\n supplyRewardTokens.push(supplyRewards[i]);\n supplyEmissions.push(data[1].toString());\n }\n }\n for (let i = 0; i < borrowRewards.length; i++) {\n const data = decodeRewardsData(borrowDataResults[i] ?? null);\n if (data && data[1] > 0n) {\n borrowRewardTokens.push(borrowRewards[i]);\n borrowEmissions.push(data[1].toString());\n }\n }\n }\n }\n } catch {\n // Incentives not supported by this deployment — silently ignore\n }\n\n // Calculate incentive APY from emissions using oracle prices\n let supplyIncentiveApy: number | undefined;\n let borrowIncentiveApy: number | undefined;\n\n const hasSupplyRewards = supplyRewardTokens.length > 0;\n const hasBorrowRewards = borrowRewardTokens.length > 0;\n\n if ((hasSupplyRewards || hasBorrowRewards) && totalSupply > 0n) {\n try {\n // Pool → AddressesProvider → Oracle (sequential, each depends on previous)\n const [providerRaw] = await multicallRead(this.rpcUrl, [\n [this.pool, encodeFunctionData({ abi: POOL_PROVIDER_ABI, functionName: \"ADDRESSES_PROVIDER\" })],\n ]);\n const providerAddr = decodeAddress(providerRaw ?? null);\n if (!providerAddr) throw new Error(\"No provider address\");\n\n const [oracleRaw] = await multicallRead(this.rpcUrl, [\n [providerAddr, encodeFunctionData({ abi: ADDRESSES_PROVIDER_ABI, functionName: \"getPriceOracle\" })],\n ]);\n const oracleAddr = decodeAddress(oracleRaw ?? null);\n if (!oracleAddr) throw new Error(\"No oracle address\");\n\n // Batch 6: assetPrice + BASE_CURRENCY_UNIT + asset decimals\n const [assetPriceRaw, baseCurrencyUnitRaw, assetDecimalsRaw] = await multicallRead(this.rpcUrl, [\n [oracleAddr, encodeFunctionData({ abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [asset] })],\n [oracleAddr, encodeFunctionData({ abi: ORACLE_ABI, functionName: \"BASE_CURRENCY_UNIT\" })],\n [asset, encodeFunctionData({ abi: ERC20_DECIMALS_ABI, functionName: \"decimals\" })],\n ]);\n\n const assetPrice = decodeU256(assetPriceRaw ?? null);\n const baseCurrencyUnit = decodeU256(baseCurrencyUnitRaw ?? null);\n // decimals() returns uint8, fits in lower bits of U256 slot\n const assetDecimals = assetDecimalsRaw ? Number(decodeU256(assetDecimalsRaw)) : 18;\n\n const priceUnit = Number(baseCurrencyUnit) || 1e8;\n const assetPriceF = Number(assetPrice) / priceUnit;\n const assetDecimalsDivisor = 10 ** assetDecimals;\n\n // Collect all unique reward tokens across supply + borrow\n const allRewardTokens = Array.from(new Set([...supplyRewardTokens, ...borrowRewardTokens])) as Address[];\n\n // Batch 7: price + decimals for all reward tokens combined\n const rewardPriceCalls: Array<[Address, Hex]> = allRewardTokens.flatMap((token): Array<[Address, Hex]> => [\n [oracleAddr, encodeFunctionData({ abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [token] })],\n [token, encodeFunctionData({ abi: ERC20_DECIMALS_ABI, functionName: \"decimals\" })],\n ]);\n\n const rewardPriceResults = rewardPriceCalls.length > 0\n ? await multicallRead(this.rpcUrl, rewardPriceCalls)\n : [];\n\n const rewardPriceMap = new Map<string, { price: bigint; decimals: number }>();\n for (let i = 0; i < allRewardTokens.length; i++) {\n const priceRaw = rewardPriceResults[i * 2] ?? null;\n const decimalsRaw = rewardPriceResults[i * 2 + 1] ?? null;\n const price = decodeU256(priceRaw);\n const decimals = decimalsRaw ? Number(decodeU256(decimalsRaw)) : 18;\n rewardPriceMap.set(allRewardTokens[i].toLowerCase(), { price, decimals });\n }\n\n // Supply-side incentive APY\n if (hasSupplyRewards) {\n let totalSupplyIncentiveUsdPerYear = 0;\n const totalSupplyUsd = (Number(totalSupply) / assetDecimalsDivisor) * assetPriceF;\n\n for (let i = 0; i < supplyRewardTokens.length; i++) {\n const emissionPerSec = BigInt(supplyEmissions[i]);\n const entry = rewardPriceMap.get(supplyRewardTokens[i].toLowerCase());\n const rewardPrice = entry?.price ?? 0n;\n const rewardDecimals = entry?.decimals ?? 18;\n if (rewardPrice > 0n) {\n const rewardPriceF = Number(rewardPrice) / priceUnit;\n const emissionPerYear = (Number(emissionPerSec) / (10 ** rewardDecimals)) * SECONDS_PER_YEAR;\n totalSupplyIncentiveUsdPerYear += emissionPerYear * rewardPriceF;\n }\n }\n if (totalSupplyUsd > 0) {\n supplyIncentiveApy = (totalSupplyIncentiveUsdPerYear / totalSupplyUsd) * 100;\n }\n }\n\n // Borrow-side incentive APY\n if (hasBorrowRewards && totalBorrow > 0n) {\n let totalBorrowIncentiveUsdPerYear = 0;\n const totalBorrowUsd = (Number(totalBorrow) / assetDecimalsDivisor) * assetPriceF;\n\n for (let i = 0; i < borrowRewardTokens.length; i++) {\n const emissionPerSec = BigInt(borrowEmissions[i]);\n const entry = rewardPriceMap.get(borrowRewardTokens[i].toLowerCase());\n const rewardPrice = entry?.price ?? 0n;\n const rewardDecimals = entry?.decimals ?? 18;\n if (rewardPrice > 0n) {\n const rewardPriceF = Number(rewardPrice) / priceUnit;\n const emissionPerYear = (Number(emissionPerSec) / (10 ** rewardDecimals)) * SECONDS_PER_YEAR;\n totalBorrowIncentiveUsdPerYear += emissionPerYear * rewardPriceF;\n }\n }\n if (totalBorrowUsd > 0) {\n borrowIncentiveApy = (totalBorrowIncentiveUsdPerYear / totalBorrowUsd) * 100;\n }\n }\n } catch {\n // Oracle not available — skip incentive APY calculation\n }\n }\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyRate,\n borrow_variable_apy: variableRate,\n borrow_stable_apy: stableRate,\n utilization,\n total_supply: totalSupply,\n total_borrow: totalBorrow,\n ...(hasSupplyRewards && {\n supply_reward_tokens: supplyRewardTokens,\n supply_emissions_per_second: supplyEmissions,\n }),\n ...(hasBorrowRewards && {\n borrow_reward_tokens: borrowRewardTokens,\n borrow_emissions_per_second: borrowEmissions,\n }),\n ...(supplyIncentiveApy !== undefined && { supply_incentive_apy: supplyIncentiveApy }),\n ...(borrowIncentiveApy !== undefined && { borrow_incentive_apy: borrowIncentiveApy }),\n };\n }\n\n async getUserPosition(user: Address): Promise<UserPosition> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getUserAccountData\",\n args: [user],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getUserAccountData failed: ${e}`);\n });\n\n const [totalCollateralBase, totalDebtBase, , , ltv, healthFactor] = result;\n const MAX_UINT256 = 2n ** 256n - 1n;\n const hf = healthFactor >= MAX_UINT256 ? Infinity : Number(healthFactor) / 1e18;\n const collateralUsd = u256ToF64(totalCollateralBase) / 1e8;\n const debtUsd = u256ToF64(totalDebtBase) / 1e8;\n const ltvBps = u256ToF64(ltv);\n\n const supplies = collateralUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Collateral\", amount: totalCollateralBase, value_usd: collateralUsd }]\n : [];\n const borrows = debtUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Debt\", amount: totalDebtBase, value_usd: debtUsd }]\n : [];\n\n return {\n protocol: this.protocolName,\n user,\n supplies,\n borrows,\n health_factor: hf,\n net_apy: ltvBps / 100,\n };\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n InterestRateMode,\n} from \"@hypurrquant/defi-core\";\n\n// V2 uses deposit/borrow/repay/withdraw (same as V3 for borrow/repay/withdraw)\nconst POOL_ABI = parseAbi([\n \"function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external\",\n \"function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf) external\",\n \"function repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) external returns (uint256)\",\n \"function withdraw(address asset, uint256 amount, address to) external returns (uint256)\",\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n // V2 getReserveData: 12 fields (no accruedToTreasury/unbacked/isolationModeTotalDebt)\n // positions: [0]=configuration, [1]=liquidityIndex, [2]=variableBorrowIndex,\n // [3]=currentLiquidityRate, [4]=currentVariableBorrowRate, [5]=currentStableBorrowRate,\n // [6]=lastUpdateTimestamp, [7]=aTokenAddress, [8]=stableDebtTokenAddress,\n // [9]=variableDebtTokenAddress, [10]=interestRateStrategyAddress, [11]=id\n \"function getReserveData(address asset) external view returns (uint256 configuration, uint128 liquidityIndex, uint128 variableBorrowIndex, uint128 currentLiquidityRate, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint8 id)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nfunction u256ToF64(v: bigint): number {\n const MAX_U128 = (1n << 128n) - 1n;\n if (v > MAX_U128) return Infinity;\n return Number(v);\n}\n\nexport class AaveV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly pool: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const pool = entry.contracts?.[\"pool\"];\n if (!pool) throw DefiError.contractError(`[${entry.name}] Missing 'pool' contract address`);\n this.pool = pool;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"deposit\",\n args: [params.asset, params.amount, params.on_behalf_of, 0],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"borrow\",\n args: [params.asset, params.amount, rateMode, 0, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"repay\",\n args: [params.asset, params.amount, rateMode, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n args: [asset],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData failed: ${e}`);\n });\n\n const RAY = 1e27;\n const SECONDS_PER_YEAR = 31536000;\n\n // Convert ray rate to APY: ((1 + rate/SECONDS_PER_YEAR)^SECONDS_PER_YEAR - 1) * 100\n const toApy = (rayRate: bigint): number => {\n const rate = Number(rayRate) / RAY;\n return (Math.pow(1 + rate / SECONDS_PER_YEAR, SECONDS_PER_YEAR) - 1) * 100;\n };\n\n // V2 field positions:\n // [3] = currentLiquidityRate, [4] = currentVariableBorrowRate, [5] = currentStableBorrowRate\n // [7] = aTokenAddress, [9] = variableDebtTokenAddress\n const supplyRate = toApy(result[3]);\n const variableRate = toApy(result[4]);\n const stableRate = toApy(result[5]);\n\n const aTokenAddress = result[7] as Address;\n const variableDebtTokenAddress = result[9] as Address;\n\n const [totalSupply, totalBorrow] = await Promise.all([\n client.readContract({\n address: aTokenAddress,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch(() => 0n),\n client.readContract({\n address: variableDebtTokenAddress,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch(() => 0n),\n ]);\n\n const utilization = totalSupply > 0n\n ? Number((totalBorrow * 10000n) / totalSupply) / 100\n : 0;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyRate,\n borrow_variable_apy: variableRate,\n borrow_stable_apy: stableRate,\n utilization,\n total_supply: totalSupply,\n total_borrow: totalBorrow,\n };\n }\n\n async getUserPosition(user: Address): Promise<UserPosition> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getUserAccountData\",\n args: [user],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getUserAccountData failed: ${e}`);\n });\n\n const [totalCollateralBase, totalDebtBase, , , ltv, healthFactor] = result;\n const MAX_UINT256 = 2n ** 256n - 1n;\n const hf = healthFactor >= MAX_UINT256 ? Infinity : Number(healthFactor) / 1e18;\n // V2 returns values in ETH (18 decimals) vs V3's base currency (8 decimals)\n const collateralUsd = u256ToF64(totalCollateralBase) / 1e18;\n const debtUsd = u256ToF64(totalDebtBase) / 1e18;\n const ltvBps = u256ToF64(ltv);\n\n const supplies = collateralUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Collateral\", amount: totalCollateralBase, value_usd: collateralUsd }]\n : [];\n const borrows = debtUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Debt\", amount: totalDebtBase, value_usd: debtUsd }]\n : [];\n\n return {\n protocol: this.protocolName,\n user,\n supplies,\n borrows,\n health_factor: hf,\n net_apy: ltvBps / 100,\n };\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry, type PriceData } from \"@hypurrquant/defi-core\";\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n \"function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory)\",\n \"function BASE_CURRENCY_UNIT() external view returns (uint256)\",\n]);\n\nexport class AaveOracleAdapter implements IOracle {\n private readonly protocolName: string;\n private readonly oracle: Address;\n private readonly rpcUrl: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!rpcUrl) throw DefiError.rpcError(`[${entry.name}] RPC URL required for oracle`);\n this.rpcUrl = rpcUrl;\n const oracle = entry.contracts?.[\"oracle\"];\n if (!oracle) throw DefiError.contractError(`[${entry.name}] Missing 'oracle' contract address`);\n this.oracle = oracle;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getPrice(asset: Address): Promise<PriceData> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const baseUnit = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"BASE_CURRENCY_UNIT\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] BASE_CURRENCY_UNIT failed: ${e}`);\n });\n\n const priceVal = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"getAssetPrice\",\n args: [asset],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getAssetPrice failed: ${e}`);\n });\n\n const priceF64 = baseUnit > 0n ? Number(priceVal) / Number(baseUnit) : 0;\n const priceUsd = baseUnit > 0n\n ? (priceVal * (10n ** 18n)) / baseUnit\n : 0n;\n\n return {\n source: `${this.protocolName} Oracle`,\n source_type: \"oracle\",\n asset,\n price_usd: priceUsd,\n price_f64: priceF64,\n };\n }\n\n async getPrices(assets: Address[]): Promise<PriceData[]> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const baseUnit = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"BASE_CURRENCY_UNIT\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] BASE_CURRENCY_UNIT failed: ${e}`);\n });\n\n const rawPrices = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"getAssetsPrices\",\n args: [assets],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getAssetsPrices failed: ${e}`);\n });\n\n return (rawPrices as bigint[]).map((priceVal, i) => {\n const priceF64 = baseUnit > 0n ? Number(priceVal) / Number(baseUnit) : 0;\n const priceUsd = baseUnit > 0n ? (priceVal * (10n ** 18n)) / baseUnit : 0n;\n return {\n source: `${this.protocolName} Oracle`,\n source_type: \"oracle\",\n asset: assets[i]!,\n price_usd: priceUsd,\n price_f64: priceF64,\n };\n });\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst CTOKEN_ABI = parseAbi([\n \"function underlying() external view returns (address)\",\n \"function supplyRatePerBlock() external view returns (uint256)\",\n \"function borrowRatePerBlock() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrows() external view returns (uint256)\",\n \"function mint(uint256 mintAmount) external returns (uint256)\",\n \"function redeem(uint256 redeemTokens) external returns (uint256)\",\n \"function borrow(uint256 borrowAmount) external returns (uint256)\",\n \"function repayBorrow(uint256 repayAmount) external returns (uint256)\",\n]);\n\n// ~3s blocks on BSC\nconst BSC_BLOCKS_PER_YEAR = 10_512_000;\n\nexport class CompoundV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly defaultVtoken: Address;\n private readonly vTokenCandidates: Address[];\n private readonly rpcUrl?: string;\n // Lazy cache: underlying asset address (lowercased) → vToken address\n private vTokenByAsset: Map<string, Address> | null = null;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const vtoken =\n contracts[\"vusdt\"] ??\n contracts[\"vusdc\"] ??\n contracts[\"vbnb\"] ??\n contracts[\"comptroller\"];\n if (!vtoken) throw DefiError.contractError(\"Missing vToken or comptroller address\");\n this.defaultVtoken = vtoken;\n // Collect all keys that look like vTokens (`v<symbol>`) — used by getRates\n // to resolve the per-asset market. Falls back to defaultVtoken if empty.\n this.vTokenCandidates = Object.entries(contracts)\n .filter(([k]) => /^v[a-z][a-z0-9]*$/i.test(k))\n .map(([, v]) => v as Address);\n if (this.vTokenCandidates.length === 0) this.vTokenCandidates = [vtoken];\n }\n\n private async resolveVtoken(asset: Address): Promise<Address | null> {\n if (!this.rpcUrl) return null;\n if (!this.vTokenByAsset) {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const map = new Map<string, Address>();\n const lookups = await Promise.allSettled(\n this.vTokenCandidates.map(async (v) => {\n const u = await client.readContract({ address: v, abi: CTOKEN_ABI, functionName: \"underlying\" }) as Address;\n return [u.toLowerCase(), v] as const;\n }),\n );\n for (const r of lookups) {\n if (r.status === \"fulfilled\") map.set(r.value[0], r.value[1]);\n }\n this.vTokenByAsset = map;\n }\n return this.vTokenByAsset.get(asset.toLowerCase()) ?? null;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"mint\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"borrow\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"repayBorrow\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"redeem\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw from Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // Resolve the vToken whose underlying() matches the requested asset.\n // Compound V2 forks (Venus etc.) have a separate vToken per asset; using a\n // single default vToken contaminates cross-asset yield scans.\n const vtoken = await this.resolveVtoken(asset);\n if (!vtoken) {\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: 0,\n borrow_variable_apy: 0,\n utilization: 0,\n total_supply: 0n,\n total_borrow: 0n,\n };\n }\n\n const [supplyRate, borrowRate, totalSupply, totalBorrows] = await Promise.all([\n client.readContract({ address: vtoken, abi: CTOKEN_ABI, functionName: \"supplyRatePerBlock\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyRatePerBlock failed: ${e}`); }),\n client.readContract({ address: vtoken, abi: CTOKEN_ABI, functionName: \"borrowRatePerBlock\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] borrowRatePerBlock failed: ${e}`); }),\n client.readContract({ address: vtoken, abi: CTOKEN_ABI, functionName: \"totalSupply\" }).catch(() => 0n),\n client.readContract({ address: vtoken, abi: CTOKEN_ABI, functionName: \"totalBorrows\" }).catch(() => 0n),\n ]);\n\n const supplyPerBlock = Number(supplyRate) / 1e18;\n const borrowPerBlock = Number(borrowRate) / 1e18;\n const supplyApy = supplyPerBlock * BSC_BLOCKS_PER_YEAR * 100;\n const borrowApy = borrowPerBlock * BSC_BLOCKS_PER_YEAR * 100;\n\n const supplyF = Number(totalSupply);\n const borrowF = Number(totalBorrows);\n const utilization = supplyF > 0 ? (borrowF / supplyF) * 100 : 0;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrows as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] User position requires querying individual vToken balances`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst COMET_ABI = parseAbi([\n \"function baseToken() external view returns (address)\",\n \"function getUtilization() external view returns (uint256)\",\n \"function getSupplyRate(uint256 utilization) external view returns (uint64)\",\n \"function getBorrowRate(uint256 utilization) external view returns (uint64)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrow() external view returns (uint256)\",\n \"function supply(address asset, uint256 amount) external\",\n \"function withdraw(address asset, uint256 amount) external\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\nexport class CompoundV3Adapter implements ILending {\n private readonly protocolName: string;\n private readonly comet: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const comet = contracts[\"comet_usdc\"] ?? contracts[\"comet\"] ?? contracts[\"comet_weth\"];\n if (!comet) throw DefiError.contractError(\"Missing 'comet_usdc' or 'comet' address\");\n this.comet = comet;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.comet, amount: params.amount }],\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n // In Compound V3, borrow = withdraw base asset\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n // In Compound V3, repay = supply base asset\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.comet, amount: params.amount }],\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw from Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // Compound V3 has a separate Comet contract per base asset. The configured\n // comet only serves rates for its own base token; for any other asset, return\n // zero rates so cross-asset yield scans don't surface mislabeled data.\n const baseToken = await client.readContract({\n address: this.comet,\n abi: COMET_ABI,\n functionName: \"baseToken\",\n }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] baseToken failed: ${e}`); }) as Address;\n if (baseToken.toLowerCase() !== asset.toLowerCase()) {\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: 0,\n borrow_variable_apy: 0,\n utilization: 0,\n total_supply: 0n,\n total_borrow: 0n,\n };\n }\n\n const utilization = await client.readContract({\n address: this.comet,\n abi: COMET_ABI,\n functionName: \"getUtilization\",\n }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getUtilization failed: ${e}`); });\n\n const [supplyRate, borrowRate, totalSupply, totalBorrow] = await Promise.all([\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"getSupplyRate\", args: [utilization as bigint] }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getSupplyRate failed: ${e}`); }),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"getBorrowRate\", args: [utilization as bigint] }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getBorrowRate failed: ${e}`); }),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"totalSupply\" }).catch(() => 0n),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"totalBorrow\" }).catch(() => 0n),\n ]);\n\n // Comet rates are per-second scaled by 1e18\n const supplyPerSec = Number(supplyRate) / 1e18;\n const borrowPerSec = Number(borrowRate) / 1e18;\n const supplyApy = supplyPerSec * SECONDS_PER_YEAR * 100;\n const borrowApy = borrowPerSec * SECONDS_PER_YEAR * 100;\n const utilPct = Number(utilization as bigint) / 1e18 * 100;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization: utilPct,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrow as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] User position requires querying Comet balanceOf + borrowBalanceOf`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst EULER_VAULT_ABI = parseAbi([\n \"function deposit(uint256 amount, address receiver) external returns (uint256)\",\n \"function withdraw(uint256 amount, address receiver, address owner) external returns (uint256)\",\n \"function borrow(uint256 amount, address receiver) external returns (uint256)\",\n \"function repay(uint256 amount, address receiver) external returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrows() external view returns (uint256)\",\n \"function interestRate() external view returns (uint256)\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\nexport class EulerV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly euler: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const euler = contracts[\"evk_vault\"] ?? contracts[\"euler\"] ?? contracts[\"markets\"];\n if (!euler) throw DefiError.contractError(\"Missing 'evk_vault' or 'euler' contract address\");\n this.euler = euler;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"deposit\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Deposit ${params.amount} into Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"borrow\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"repay\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"withdraw\",\n args: [params.amount, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [totalSupply, totalBorrows, interestRate] = await Promise.all([\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"totalSupply\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`); }),\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"totalBorrows\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalBorrows failed: ${e}`); }),\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"interestRate\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] interestRate failed: ${e}`); }),\n ]);\n\n // Euler V2 interest rates per-second scaled by 1e27\n const rateF64 = Number(interestRate) / 1e27;\n const borrowApy = rateF64 * SECONDS_PER_YEAR * 100;\n\n const supplyF = Number(totalSupply);\n const borrowF = Number(totalBorrows);\n const utilization = supplyF > 0 ? (borrowF / supplyF) * 100 : 0;\n const supplyApy = borrowApy * (borrowF / Math.max(supplyF, 1));\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrows as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Euler V2 user positions require querying individual vault balances. Use the vault address directly to check balanceOf(user) for supply positions.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData, decodeFunctionResult, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n multicallRead,\n decodeU256,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst MORPHO_ABI = parseAbi([\n \"function market(bytes32 id) external view returns (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee)\",\n \"function idToMarketParams(bytes32 id) external view returns (address loanToken, address collateralToken, address oracle, address irm, uint256 lltv)\",\n \"function supply((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, bytes data) external returns (uint256 assetsSupplied, uint256 sharesSupplied)\",\n \"function borrow((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver) external returns (uint256 assetsBorrowed, uint256 sharesBorrowed)\",\n \"function repay((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, bytes data) external returns (uint256 assetsRepaid, uint256 sharesRepaid)\",\n \"function withdraw((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver) external returns (uint256 assetsWithdrawn, uint256 sharesWithdrawn)\",\n]);\n\nconst META_MORPHO_ABI = parseAbi([\n \"function supplyQueueLength() external view returns (uint256)\",\n \"function supplyQueue(uint256 index) external view returns (bytes32)\",\n \"function totalAssets() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nconst ERC4626_ABI = parseAbi([\n \"function asset() external view returns (address)\",\n \"function deposit(uint256 assets, address receiver) external returns (uint256 shares)\",\n \"function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets)\",\n \"function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares)\",\n \"function balanceOf(address owner) external view returns (uint256)\",\n]);\n\nconst MAX_UINT256 = (1n << 256n) - 1n;\n\nconst IRM_ABI = parseAbi([\n \"function borrowRateView((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee) market) external view returns (uint256)\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\ntype MarketParams = {\n loanToken: Address;\n collateralToken: Address;\n oracle: Address;\n irm: Address;\n lltv: bigint;\n};\n\nfunction defaultMarketParams(loanToken: Address = zeroAddress as Address): MarketParams {\n return {\n loanToken,\n collateralToken: zeroAddress as Address,\n oracle: zeroAddress as Address,\n irm: zeroAddress as Address,\n lltv: 0n,\n };\n}\n\nfunction decodeMarket(data: Hex | null): [bigint, bigint, bigint, bigint, bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: MORPHO_ABI,\n functionName: \"market\",\n data,\n }) as [bigint, bigint, bigint, bigint, bigint, bigint];\n } catch {\n return null;\n }\n}\n\nfunction decodeMarketParams(data: Hex | null): [Address, Address, Address, Address, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: MORPHO_ABI,\n functionName: \"idToMarketParams\",\n data,\n }) as [Address, Address, Address, Address, bigint];\n } catch {\n return null;\n }\n}\n\nexport class MorphoBlueAdapter implements ILending {\n private readonly protocolName: string;\n private readonly morpho: Address;\n private readonly defaultVault?: Address;\n private readonly rpcUrl?: string;\n private readonly metaMorphoVaults: Address[];\n private readonly metaMorphoVaultEntries: Array<{ key: string; addr: Address }>;\n private vaultAssetMap: Map<string, Address> | null = null;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const morpho = contracts[\"morpho_blue\"];\n if (!morpho) throw DefiError.contractError(\"Missing 'morpho_blue' contract address\");\n this.morpho = morpho;\n this.defaultVault =\n contracts[\"fehype\"] ?? contracts[\"vault\"] ?? contracts[\"feusdc\"];\n this.metaMorphoVaultEntries = Object.entries(contracts)\n .filter(([key]) => /^fe[a-z0-9_]+$/i.test(key) || key === \"vault\")\n .map(([key, addr]) => ({ key, addr }));\n this.metaMorphoVaults = this.metaMorphoVaultEntries.map((e) => e.addr);\n }\n\n private async resolveVault(asset: Address, preferKey?: string): Promise<Address | null> {\n if (this.metaMorphoVaultEntries.length === 0 || !this.rpcUrl) return null;\n if (preferKey) {\n const direct = this.metaMorphoVaultEntries.find((e) => e.key === preferKey);\n if (direct) return direct.addr;\n }\n if (!this.vaultAssetMap) {\n const calls = this.metaMorphoVaultEntries.map((e) => [\n e.addr,\n encodeFunctionData({ abi: ERC4626_ABI, functionName: \"asset\" }),\n ]) as Array<[Address, Hex]>;\n const results = await multicallRead(this.rpcUrl, calls).catch(() => []);\n const map = new Map<string, { key: string; addr: Address }>();\n for (let i = 0; i < results.length; i++) {\n const data = results[i];\n if (!data || data.length < 66) continue;\n const a = (`0x${data.slice(26, 66)}`).toLowerCase();\n const entry = this.metaMorphoVaultEntries[i] as { key: string; addr: Address };\n const existing = map.get(a);\n // Prefer canonical (shortest key) — avoids feusdt0_frontier silently overwriting feusdt0\n if (!existing || entry.key.length < existing.key.length) {\n map.set(a, entry);\n }\n }\n const flatMap = new Map<string, Address>();\n for (const [k, v] of map) flatMap.set(k, v.addr);\n this.vaultAssetMap = flatMap;\n }\n return this.vaultAssetMap.get(asset.toLowerCase()) ?? null;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const vault = await this.resolveVault(params.asset);\n if (vault) {\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"deposit\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Deposit ${params.amount} into MetaMorpho vault`,\n to: vault,\n data,\n value: 0n,\n gas_estimate: 400_000,\n approvals: [{ token: params.asset, spender: vault, amount: params.amount }],\n };\n }\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"supply\",\n args: [market, params.amount, 0n, params.on_behalf_of, \"0x\"],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"borrow\",\n args: [market, params.amount, 0n, params.on_behalf_of, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"repay\",\n args: [market, params.amount, 0n, params.on_behalf_of, \"0x\"],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const vault = await this.resolveVault(params.asset);\n if (vault) {\n if (params.amount === MAX_UINT256) {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC required to fetch vault shares\");\n const [balRaw] = await multicallRead(this.rpcUrl, [\n [vault, encodeFunctionData({ abi: ERC4626_ABI, functionName: \"balanceOf\", args: [params.to] })],\n ]);\n const shares = decodeU256(balRaw ?? null);\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"redeem\",\n args: [shares, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Redeem all shares (${shares}) from MetaMorpho vault`,\n to: vault, data, value: 0n, gas_estimate: 400_000,\n };\n }\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"withdraw\",\n args: [params.amount, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} assets from MetaMorpho vault`,\n to: vault, data, value: 0n, gas_estimate: 400_000,\n };\n }\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"withdraw\",\n args: [market, params.amount, 0n, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n if (!this.defaultVault) {\n return { protocol: this.protocolName, asset, supply_apy: 0, borrow_variable_apy: 0, borrow_stable_apy: 0, utilization: 0, total_supply: 0n, total_borrow: 0n };\n }\n\n // Batch 1: supplyQueueLength (gate check)\n const [queueLenRaw] = await multicallRead(this.rpcUrl, [\n [this.defaultVault, encodeFunctionData({ abi: META_MORPHO_ABI, functionName: \"supplyQueueLength\" })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyQueueLength failed: ${e}`); });\n\n const queueLen = decodeU256(queueLenRaw ?? null);\n\n if (queueLen === 0n) {\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: 0,\n borrow_variable_apy: 0,\n utilization: 0,\n total_supply: 0n,\n total_borrow: 0n,\n };\n }\n\n // supplyQueue(0) — single call, depends on queueLen > 0\n const [marketIdRaw] = await multicallRead(this.rpcUrl, [\n [this.defaultVault, encodeFunctionData({ abi: META_MORPHO_ABI, functionName: \"supplyQueue\", args: [0n] })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyQueue(0) failed: ${e}`); });\n\n if (!marketIdRaw || marketIdRaw.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] supplyQueue(0) returned no data`);\n }\n const marketId = marketIdRaw.slice(0, 66) as `0x${string}`;\n\n // Batch 2: market + idToMarketParams (both depend on marketId, independent of each other)\n const [marketRaw, paramsRaw] = await multicallRead(this.rpcUrl, [\n [this.morpho, encodeFunctionData({ abi: MORPHO_ABI, functionName: \"market\", args: [marketId] })],\n [this.morpho, encodeFunctionData({ abi: MORPHO_ABI, functionName: \"idToMarketParams\", args: [marketId] })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] market/idToMarketParams failed: ${e}`); });\n\n const mktDecoded = decodeMarket(marketRaw ?? null);\n if (!mktDecoded) throw DefiError.rpcError(`[${this.protocolName}] market() returned no data`);\n const [totalSupplyAssets, totalSupplyShares, totalBorrowAssets, totalBorrowShares, lastUpdate, fee] = mktDecoded;\n\n const paramsDecoded = decodeMarketParams(paramsRaw ?? null);\n if (!paramsDecoded) throw DefiError.rpcError(`[${this.protocolName}] idToMarketParams returned no data`);\n const [loanToken, collateralToken, oracle, irm, lltv] = paramsDecoded;\n\n const supplyF = Number(totalSupplyAssets);\n const borrowF = Number(totalBorrowAssets);\n const util = supplyF > 0 ? borrowF / supplyF : 0;\n\n const irmMarketParams: MarketParams = { loanToken, collateralToken, oracle, irm, lltv };\n const irmMarket = { totalSupplyAssets, totalSupplyShares, totalBorrowAssets, totalBorrowShares, lastUpdate, fee };\n\n // borrowRateView depends on both market + idToMarketParams results — keep separate\n const borrowRatePerSec = await (async () => {\n const [borrowRateRaw] = await multicallRead(this.rpcUrl!, [\n [irm, encodeFunctionData({ abi: IRM_ABI, functionName: \"borrowRateView\", args: [irmMarketParams, irmMarket] })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] borrowRateView failed: ${e}`); });\n return decodeU256(borrowRateRaw ?? null);\n })();\n\n const ratePerSec = Number(borrowRatePerSec) / 1e18;\n const borrowApy = ratePerSec * SECONDS_PER_YEAR * 100;\n const feePct = Number(fee) / 1e18;\n const supplyApy = borrowApy * util * (1 - feePct);\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization: util * 100,\n total_supply: totalSupplyAssets,\n total_borrow: totalBorrowAssets,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Morpho Blue user positions are per-market — use vault deposit/withdraw instead`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ICdp } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OpenCdpParams,\n type AdjustCdpParams,\n type CloseCdpParams,\n type CdpInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst BORROWER_OPS_ABI = parseAbi([\n \"function openTrove(address _owner, uint256 _ownerIndex, uint256 _collAmount, uint256 _boldAmount, uint256 _upperHint, uint256 _lowerHint, uint256 _annualInterestRate, uint256 _maxUpfrontFee, address _addManager, address _removeManager, address _receiver) external returns (uint256)\",\n \"function adjustTrove(uint256 _troveId, uint256 _collChange, bool _isCollIncrease, uint256 _debtChange, bool _isDebtIncrease, uint256 _upperHint, uint256 _lowerHint, uint256 _maxUpfrontFee) external\",\n \"function closeTrove(uint256 _troveId) external\",\n]);\n\nconst TROVE_MANAGER_ABI = parseAbi([\n \"function getLatestTroveData(uint256 _troveId) external view returns (uint256 entireDebt, uint256 entireColl, uint256 redistDebtGain, uint256 redistCollGain, uint256 accruedInterest, uint256 recordedDebt, uint256 annualInterestRate, uint256 accruedBatchManagementFee, uint256 weightedRecordedDebt, uint256 lastInterestRateAdjTime)\",\n]);\n\nconst HINT_HELPERS_ABI = parseAbi([\n \"function getApproxHint(uint256 _collIndex, uint256 _interestRate, uint256 _numTrials, uint256 _inputRandomSeed) external view returns (uint256 hintId, uint256 diff, uint256 latestRandomSeed)\",\n]);\n\nconst SORTED_TROVES_ABI = parseAbi([\n \"function findInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external view returns (uint256 prevId, uint256 nextId)\",\n]);\n\nexport class FelixCdpAdapter implements ICdp {\n private readonly protocolName: string;\n private readonly borrowerOperations: Address;\n private readonly troveManager?: Address;\n private readonly hintHelpers?: Address;\n private readonly sortedTroves?: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const bo = contracts[\"borrower_operations\"];\n if (!bo) throw DefiError.contractError(\"Missing 'borrower_operations' contract\");\n this.borrowerOperations = bo;\n this.troveManager = contracts[\"trove_manager\"];\n this.hintHelpers = contracts[\"hint_helpers\"];\n this.sortedTroves = contracts[\"sorted_troves\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n private async getHints(interestRate: bigint): Promise<[bigint, bigint]> {\n if (!this.hintHelpers || !this.sortedTroves || !this.rpcUrl) {\n return [0n, 0n];\n }\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const approxResult = await client.readContract({\n address: this.hintHelpers,\n abi: HINT_HELPERS_ABI,\n functionName: \"getApproxHint\",\n args: [0n, interestRate, 15n, 42n],\n }).catch(() => null);\n\n if (!approxResult) return [0n, 0n];\n const [hintId] = approxResult as [bigint, bigint, bigint];\n\n const insertResult = await client.readContract({\n address: this.sortedTroves,\n abi: SORTED_TROVES_ABI,\n functionName: \"findInsertPosition\",\n args: [interestRate, hintId, hintId],\n }).catch(() => null);\n\n if (!insertResult) return [0n, 0n];\n const [prevId, nextId] = insertResult as [bigint, bigint];\n return [prevId, nextId];\n }\n\n async buildOpen(params: OpenCdpParams): Promise<DeFiTx> {\n const interestRate = 50000000000000000n; // 5% default\n const [upperHint, lowerHint] = await this.getHints(interestRate);\n const hasHints = upperHint !== 0n || lowerHint !== 0n;\n\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"openTrove\",\n args: [\n params.recipient,\n 0n,\n params.collateral_amount,\n params.debt_amount,\n upperHint,\n lowerHint,\n interestRate,\n BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"), // U256::MAX\n params.recipient,\n params.recipient,\n params.recipient,\n ],\n });\n\n return {\n description: `[${this.protocolName}] Open trove: collateral=${params.collateral_amount}, debt=${params.debt_amount} (hints=${hasHints ? \"optimized\" : \"none\"})`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: hasHints ? 500_000 : 5_000_000,\n };\n }\n\n async buildAdjust(params: AdjustCdpParams): Promise<DeFiTx> {\n const collChange = params.collateral_delta ?? 0n;\n const debtChange = params.debt_delta ?? 0n;\n\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"adjustTrove\",\n args: [\n params.cdp_id,\n collChange,\n params.add_collateral,\n debtChange,\n params.add_debt,\n 0n,\n 0n,\n BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Adjust trove ${params.cdp_id}`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n async buildClose(params: CloseCdpParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"closeTrove\",\n args: [params.cdp_id],\n });\n\n return {\n description: `[${this.protocolName}] Close trove ${params.cdp_id}`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async getCdpInfo(cdpId: bigint): Promise<CdpInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(`[${this.protocolName}] getCdpInfo requires RPC — set HYPEREVM_RPC_URL`);\n if (!this.troveManager) throw DefiError.contractError(`[${this.protocolName}] trove_manager contract not configured`);\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const data = await client.readContract({\n address: this.troveManager,\n abi: TROVE_MANAGER_ABI,\n functionName: \"getLatestTroveData\",\n args: [cdpId],\n }).catch((e: unknown) => {\n throw DefiError.invalidParam(`[${this.protocolName}] Trove ${cdpId} not found: ${e}`);\n });\n\n const [entireDebt, entireColl] = data as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint];\n\n if (entireDebt === 0n && entireColl === 0n) {\n throw DefiError.invalidParam(`[${this.protocolName}] Trove ${cdpId} does not exist`);\n }\n\n const collRatio = entireDebt > 0n ? Number(entireColl) / Number(entireDebt) : 0;\n\n return {\n protocol: this.protocolName,\n cdp_id: cdpId,\n collateral: {\n token: zeroAddress as Address,\n symbol: \"WHYPE\",\n amount: entireColl,\n decimals: 18,\n },\n debt: {\n token: zeroAddress as Address,\n symbol: \"feUSD\",\n amount: entireDebt,\n decimals: 18,\n },\n collateral_ratio: collRatio,\n };\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry, type PriceData } from \"@hypurrquant/defi-core\";\n\nconst PRICE_FEED_ABI = parseAbi([\n \"function fetchPrice() external view returns (uint256 price, bool isNewOracleFailureDetected)\",\n \"function lastGoodPrice() external view returns (uint256)\",\n]);\n\nexport class FelixOracleAdapter implements IOracle {\n private readonly protocolName: string;\n private readonly priceFeed: Address;\n private readonly asset: Address;\n private readonly rpcUrl: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!rpcUrl) throw DefiError.rpcError(`[${entry.name}] RPC URL required for oracle`);\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const feed = contracts[\"price_feed\"];\n if (!feed) throw DefiError.contractError(`[${entry.name}] Missing 'price_feed' contract address`);\n this.priceFeed = feed;\n // The asset address is stored under \"asset\" or falls back to zero (WHYPE native)\n this.asset = contracts[\"asset\"] ?? (\"0x0000000000000000000000000000000000000000\" as Address);\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getPrice(asset: Address): Promise<PriceData> {\n if (asset !== this.asset && this.asset !== \"0x0000000000000000000000000000000000000000\") {\n throw DefiError.unsupported(`[${this.protocolName}] Felix PriceFeed only supports asset ${this.asset}`);\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n let priceVal: bigint;\n try {\n const result = await client.readContract({\n address: this.priceFeed,\n abi: PRICE_FEED_ABI,\n functionName: \"fetchPrice\",\n });\n const [price] = result as [bigint, boolean];\n priceVal = price;\n } catch {\n // Fall back to lastGoodPrice\n priceVal = await client.readContract({\n address: this.priceFeed,\n abi: PRICE_FEED_ABI,\n functionName: \"lastGoodPrice\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] lastGoodPrice failed: ${e}`);\n }) as bigint;\n }\n\n // Felix prices are already in 18-decimal USD\n const priceF64 = Number(priceVal) / 1e18;\n\n return {\n source: \"Felix PriceFeed\",\n source_type: \"oracle\",\n asset,\n price_usd: priceVal,\n price_f64: priceF64,\n };\n }\n\n async getPrices(assets: Address[]): Promise<PriceData[]> {\n const results: PriceData[] = [];\n for (const asset of assets) {\n try {\n results.push(await this.getPrice(asset));\n } catch {\n // Skip unsupported assets\n }\n }\n return results;\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IVault } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type VaultInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst ERC4626_ABI = parseAbi([\n \"function asset() external view returns (address)\",\n \"function totalAssets() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function convertToShares(uint256 assets) external view returns (uint256)\",\n \"function convertToAssets(uint256 shares) external view returns (uint256)\",\n \"function deposit(uint256 assets, address receiver) external returns (uint256 shares)\",\n \"function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares)\",\n]);\n\nexport class ERC4626VaultAdapter implements IVault {\n private readonly protocolName: string;\n private readonly vaultAddress: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const vault = entry.contracts?.[\"vault\"];\n if (!vault) throw DefiError.contractError(\"Missing 'vault' contract address\");\n this.vaultAddress = vault;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildDeposit(assets: bigint, receiver: Address): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"deposit\",\n args: [assets, receiver],\n });\n return {\n description: `[${this.protocolName}] Deposit ${assets} assets into vault`,\n to: this.vaultAddress,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildWithdraw(assets: bigint, receiver: Address, owner: Address): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"withdraw\",\n args: [assets, receiver, owner],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${assets} assets from vault`,\n to: this.vaultAddress,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async totalAssets(): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"totalAssets\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalAssets failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async convertToShares(assets: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"convertToShares\",\n args: [assets],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] convertToShares failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async convertToAssets(shares: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"convertToAssets\",\n args: [shares],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] convertToAssets failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async getVaultInfo(): Promise<VaultInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [totalAssets, totalSupply, asset] = await Promise.all([\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"totalAssets\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalAssets failed: ${e}`); }),\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"totalSupply\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`); }),\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"asset\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] asset failed: ${e}`); }),\n ]);\n\n return {\n protocol: this.protocolName,\n vault_address: this.vaultAddress,\n asset: asset as Address,\n total_assets: totalAssets as bigint,\n total_supply: totalSupply as bigint,\n };\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst GENERIC_LST_ABI = parseAbi([\n \"function stake() external payable returns (uint256)\",\n \"function unstake(uint256 amount) external returns (uint256)\",\n]);\n\nexport class GenericLstAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract\");\n this.staking = staking;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({ abi: GENERIC_LST_ABI, functionName: \"stake\" });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 200_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: GENERIC_LST_ABI,\n functionName: \"unstake\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Unstake ${params.amount}`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n throw DefiError.unsupported(`[${this.protocolName}] getInfo requires RPC`);\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst STHYPE_ABI = parseAbi([\n \"function submit(address referral) external payable returns (uint256)\",\n \"function requestWithdrawals(uint256[] amounts, address owner) external returns (uint256[] requestIds)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nexport class StHypeAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n private readonly sthypeToken?: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract\");\n this.staking = staking;\n this.sthypeToken = entry.contracts?.[\"sthype_token\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: STHYPE_ABI,\n functionName: \"submit\",\n args: [zeroAddress as Address],\n });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE for stHYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 200_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: STHYPE_ABI,\n functionName: \"requestWithdrawals\",\n args: [[params.amount], params.recipient],\n });\n return {\n description: `[${this.protocolName}] Request unstake ${params.amount} stHYPE`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const tokenAddr = this.sthypeToken ?? this.staking;\n\n const totalSupply = await client.readContract({\n address: tokenAddr,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`);\n }) as bigint;\n\n return {\n protocol: this.protocolName,\n staked_token: zeroAddress as Address,\n liquid_token: tokenAddr,\n exchange_rate: 1.0,\n total_staked: totalSupply,\n };\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst KINETIQ_ABI = parseAbi([\n \"function stake() external payable returns (uint256)\",\n \"function requestUnstake(uint256 amount) external returns (uint256)\",\n \"function totalStaked() external view returns (uint256)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n]);\n\n// WHYPE address on HyperEVM\nconst WHYPE: Address = \"0x5555555555555555555555555555555555555555\";\n// HyperLend oracle address (Aave V3 compatible)\nconst HYPERLEND_ORACLE: Address = \"0xc9fb4fbe842d57ea1df3e641a281827493a63030\";\n\nexport class KinetiqAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n private readonly liquidToken: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract address\");\n this.staking = staking;\n this.liquidToken = entry.contracts?.[\"khype_token\"] ?? staking;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({ abi: KINETIQ_ABI, functionName: \"stake\" });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE for kHYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 300_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: KINETIQ_ABI,\n functionName: \"requestUnstake\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Request unstake ${params.amount} kHYPE`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const totalStaked = await client.readContract({\n address: this.staking,\n abi: KINETIQ_ABI,\n functionName: \"totalStaked\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalStaked failed: ${e}`);\n }) as bigint;\n\n const [khypePrice, hypePrice] = await Promise.all([\n client.readContract({ address: HYPERLEND_ORACLE, abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [this.liquidToken] }).catch(() => 0n),\n client.readContract({ address: HYPERLEND_ORACLE, abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [WHYPE] }).catch(() => 0n),\n ]);\n\n const rateF64 =\n (hypePrice as bigint) > 0n && (khypePrice as bigint) > 0n\n ? Number((khypePrice as bigint) * 10n ** 18n / (hypePrice as bigint)) / 1e18\n : 1.0;\n\n return {\n protocol: this.protocolName,\n staked_token: zeroAddress as Address,\n liquid_token: this.liquidToken,\n exchange_rate: rateF64,\n total_staked: totalStaked,\n };\n }\n}\n","import type { Address } from \"viem\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type YieldInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class PendleAdapter implements IYieldSource {\n private readonly protocolName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!entry.contracts?.[\"router\"]) {\n throw DefiError.contractError(\"Missing 'router' contract\");\n }\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getYields(): Promise<YieldInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] getYields requires RPC`);\n }\n\n async buildDeposit(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Pendle deposit requires market address and token routing params. Use Pendle-specific CLI.`,\n );\n }\n\n async buildWithdraw(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Pendle withdraw requires market-specific params`,\n );\n }\n}\n","import type { Address } from \"viem\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type YieldInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericYieldAdapter implements IYieldSource {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getYields(): Promise<YieldInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] getYields requires RPC`);\n }\n\n async buildDeposit(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Yield interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'pendle_v2' (Pendle). Protocols like Steer (managed liquidity), ` +\n `Liminal (yield optimization), and Altura (gaming yield) need custom deposit logic.`,\n );\n }\n\n async buildWithdraw(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Yield interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'pendle_v2' (Pendle). Protocols like Steer (managed liquidity), ` +\n `Liminal (yield optimization), and Altura (gaming yield) need custom withdraw logic.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type DerivativesPositionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\n\nconst HLP_ABI = parseAbi([\n \"function deposit(uint256 amount) external returns (uint256)\",\n \"function withdraw(uint256 shares) external returns (uint256)\",\n]);\n\nexport class HlpVaultAdapter implements IDerivatives {\n private readonly protocolName: string;\n private readonly vault: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const vault = entry.contracts?.[\"vault\"];\n if (!vault) throw DefiError.contractError(\"Missing 'vault' contract\");\n this.vault = vault;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildOpenPosition(params: DerivativesPositionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: HLP_ABI,\n functionName: \"deposit\",\n args: [params.collateral],\n });\n return {\n description: `[${this.protocolName}] Deposit ${params.collateral} into HLP vault`,\n to: this.vault,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildClosePosition(params: DerivativesPositionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: HLP_ABI,\n functionName: \"withdraw\",\n args: [params.size],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.size} from HLP vault`,\n to: this.vault,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n}\n","import type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type DerivativesPositionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericDerivativesAdapter implements IDerivatives {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildOpenPosition(_params: DerivativesPositionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Derivatives interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'hlp_vault' (HLP Vault). Protocols like Rumpel need custom position management logic.`,\n );\n }\n\n async buildClosePosition(_params: DerivativesPositionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Derivatives interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'hlp_vault' (HLP Vault). Protocols like Rumpel need custom position management logic.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOptions } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OptionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst RYSK_ABI = parseAbi([\n \"function openOption(address underlying, uint256 strikePrice, uint256 expiry, bool isCall, uint256 amount) external returns (uint256 premium)\",\n \"function closeOption(address underlying, uint256 strikePrice, uint256 expiry, bool isCall, uint256 amount) external returns (uint256 payout)\",\n]);\n\nexport class RyskAdapter implements IOptions {\n private readonly protocolName: string;\n private readonly controller: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const controller = entry.contracts?.[\"controller\"];\n if (!controller) throw DefiError.contractError(\"Missing 'controller' contract\");\n this.controller = controller;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildBuy(params: OptionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: RYSK_ABI,\n functionName: \"openOption\",\n args: [\n params.underlying,\n params.strike_price,\n BigInt(params.expiry),\n params.is_call,\n params.amount,\n ],\n });\n return {\n description: `[${this.protocolName}] Buy ${params.is_call ? \"call\" : \"put\"} ${params.amount} option, strike=${params.strike_price}, expiry=${params.expiry}`,\n to: this.controller,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildSell(params: OptionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: RYSK_ABI,\n functionName: \"closeOption\",\n args: [\n params.underlying,\n params.strike_price,\n BigInt(params.expiry),\n params.is_call,\n params.amount,\n ],\n });\n return {\n description: `[${this.protocolName}] Sell/close ${params.is_call ? \"call\" : \"put\"} ${params.amount} option`,\n to: this.controller,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import type { IOptions } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OptionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericOptionsAdapter implements IOptions {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildBuy(_params: OptionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Options interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'rysk' (Rysk Finance). Other options protocols need custom strike/expiry handling.`,\n );\n }\n\n async buildSell(_params: OptionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Options interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'rysk' (Rysk Finance). Other options protocols need custom strike/expiry handling.`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { INft, NftCollectionInfo, NftTokenInfo } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry } from \"@hypurrquant/defi-core\";\n\nconst ERC721_ABI = parseAbi([\n \"function name() returns (string)\",\n \"function symbol() returns (string)\",\n \"function totalSupply() returns (uint256)\",\n \"function ownerOf(uint256 tokenId) returns (address)\",\n \"function balanceOf(address owner) returns (uint256)\",\n \"function tokenURI(uint256 tokenId) returns (string)\",\n]);\n\nexport class ERC721Adapter implements INft {\n private readonly protocolName: string;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getCollectionInfo(collection: Address): Promise<NftCollectionInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [collectionName, symbol, totalSupply] = await Promise.all([\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"name\" })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] name failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"symbol\" })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] symbol failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"totalSupply\" })\n .catch(() => undefined),\n ]);\n\n return {\n address: collection,\n name: collectionName as string,\n symbol: symbol as string,\n total_supply: totalSupply as bigint | undefined,\n };\n }\n\n async getTokenInfo(collection: Address, tokenId: bigint): Promise<NftTokenInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [owner, tokenUri] = await Promise.all([\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"ownerOf\", args: [tokenId] })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] ownerOf failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"tokenURI\", args: [tokenId] })\n .catch(() => undefined),\n ]);\n\n return {\n collection,\n token_id: tokenId,\n owner: owner as Address,\n token_uri: tokenUri as string | undefined,\n };\n }\n\n async getBalance(owner: Address, collection: Address): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n return client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"balanceOf\", args: [owner] })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] balanceOf failed: ${e}`);\n }) as Promise<bigint>;\n }\n}\n","import type { Address } from \"viem\";\n\nimport type { IDex, PriceData, QuoteParams } from \"@hypurrquant/defi-core\";\n\n/**\n * Utility for deriving spot prices from DEX quoters.\n * Quotes 1 unit of the token against a quote token (e.g. USDC) to derive price.\n */\nexport class DexSpotPrice {\n /**\n * Get the spot price for `token` denominated in `quoteToken` (e.g. USDC).\n *\n * `tokenDecimals` — decimals of the input token (to know how much \"1 unit\" is)\n * `quoteDecimals` — decimals of the quote token (to convert the output to number)\n */\n static async getPrice(\n dex: IDex,\n token: Address,\n tokenDecimals: number,\n quoteToken: Address,\n quoteDecimals: number,\n ): Promise<PriceData> {\n const amountIn = 10n ** BigInt(tokenDecimals); // 1 token\n\n const quoteParams: QuoteParams = {\n protocol: \"\",\n token_in: token,\n token_out: quoteToken,\n amount_in: amountIn,\n };\n\n const quote = await dex.quote(quoteParams);\n\n // Convert to USD price (assuming quoteToken is a USD stablecoin)\n const priceF64 = Number(quote.amount_out) / 10 ** quoteDecimals;\n\n // Normalize to 18-decimal representation\n let priceUsd: bigint;\n if (quoteDecimals < 18) {\n priceUsd = quote.amount_out * 10n ** BigInt(18 - quoteDecimals);\n } else if (quoteDecimals > 18) {\n priceUsd = quote.amount_out / 10n ** BigInt(quoteDecimals - 18);\n } else {\n priceUsd = quote.amount_out;\n }\n\n return {\n source: `dex:${dex.name()}`,\n source_type: \"dex_spot\",\n asset: token,\n price_usd: priceUsd,\n price_f64: priceF64,\n block_number: undefined,\n timestamp: undefined,\n };\n }\n}\n","import { Command } from \"commander\";\nimport { createRequire } from \"node:module\";\nimport { Executor } from \"./executor.js\";\nimport { parseOutputMode } from \"./output.js\";\nimport type { OutputMode } from \"./output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\n\nconst _require = createRequire(import.meta.url);\nconst _pkg = _require(\"../package.json\") as { version: string };\n\nimport { registerStatus } from \"./commands/status.js\";\nimport { registerSchema } from \"./commands/schema.js\";\nimport { registerLP } from \"./commands/lp.js\";\nimport { registerLending } from \"./commands/lending.js\";\nimport { registerYield } from \"./commands/yield.js\";\nimport { registerPortfolio } from \"./commands/portfolio.js\";\nimport { registerPrice } from \"./commands/price.js\";\nimport { registerWallet } from \"./commands/wallet.js\";\nimport { registerToken } from \"./commands/token.js\";\nimport { registerBridge } from \"./commands/bridge.js\";\nimport { registerSwap } from \"./commands/swap.js\";\nimport { registerSetup } from \"./commands/setup.js\";\nimport { registerOws } from \"./commands/ows.js\";\n\nfunction buildBanner(): string {\n let chainCount = 0;\n let protocolCount = 0;\n try {\n const reg = Registry.loadEmbedded();\n chainCount = reg.chains.size;\n protocolCount = reg.protocols.length;\n } catch {\n // registry load failure shouldn't break --help; fall back silently\n }\n const stats = chainCount && protocolCount\n ? `${chainCount} chains · ${protocolCount} protocols · by HypurrQuant`\n : `by HypurrQuant`;\n return `\n ██████╗ ███████╗███████╗██╗ ██████╗██╗ ██╗\n ██╔══██╗██╔════╝██╔════╝██║ ██╔════╝██║ ██║\n ██║ ██║█████╗ █████╗ ██║ ██║ ██║ ██║\n ██║ ██║██╔══╝ ██╔══╝ ██║ ██║ ██║ ██║\n ██████╔╝███████╗██║ ██║ ╚██████╗███████╗██║\n ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝╚══════╝╚═╝\n\n ${stats}\n\n Lending, LP farming, DEX swap, yield comparison\n — all from your terminal.\n`;\n}\n\nconst BANNER = buildBanner();\n\nexport const program = new Command()\n .name(\"defi\")\n .description(\"DeFi CLI — Multi-chain DeFi toolkit\")\n .version(_pkg.version)\n .addHelpText(\"before\", BANNER)\n .option(\"--json\", \"Output as JSON\")\n .option(\"--ndjson\", \"Output as newline-delimited JSON\")\n .option(\"--fields <fields>\", \"Select specific output fields (comma-separated)\")\n .option(\"--chain <chain>\", \"Target chain\")\n .option(\"--dry-run\", \"Dry-run mode (default, no broadcast)\", true)\n .option(\"--broadcast\", \"Actually broadcast the transaction\");\n\n// Helper: read global output mode from the root program options\nfunction getOutputMode(): OutputMode {\n const opts = program.opts<{\n json?: boolean;\n ndjson?: boolean;\n fields?: string;\n }>();\n return parseOutputMode(opts);\n}\n\n// Build executor from global options (lazy — must be called inside action handler, not at registration)\nfunction makeExecutor(): Executor {\n const opts = program.opts<{ broadcast?: boolean; chain?: string }>();\n const registry = Registry.loadEmbedded();\n if (!opts.chain) {\n process.stderr.write(\"Error: --chain is required for this command (e.g. --chain hyperevm)\\n\");\n process.exit(1);\n }\n const chain = registry.getChain(opts.chain);\n return new Executor(!!opts.broadcast, chain.effectiveRpcUrl(), chain.explorer_url);\n}\n\n// Register all commands\nregisterStatus(program, getOutputMode);\nregisterSchema(program, getOutputMode);\nregisterLP(program, getOutputMode, makeExecutor);\nregisterLending(program, getOutputMode, makeExecutor);\nregisterYield(program, getOutputMode, makeExecutor);\nregisterPortfolio(program, getOutputMode);\nregisterPrice(program, getOutputMode);\nregisterWallet(program, getOutputMode);\nregisterToken(program, getOutputMode, makeExecutor);\nregisterBridge(program, getOutputMode);\nregisterSwap(program, getOutputMode, makeExecutor);\nregisterSetup(program);\nregisterOws(program, getOutputMode);\n","import { createPublicClient, createWalletClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport { TxStatus } from \"@hypurrquant/defi-core\";\nimport type { ActionResult, DeFiTx } from \"@hypurrquant/defi-core\";\n\nconst ERC20_ABI = parseAbi([\n \"function allowance(address owner, address spender) external view returns (uint256)\",\n \"function approve(address spender, uint256 amount) external returns (bool)\",\n]);\n\n/** Gas buffer multiplier: 120% over estimated gas (20% headroom) */\nconst GAS_BUFFER_BPS = 12000n;\n\n/** Default max priority fee (tip) in wei — 20 gwei (safe for Mantle + EVM chains) */\nconst DEFAULT_PRIORITY_FEE_WEI = 20_000_000_000n;\n\n/** Max gas limit cap — Mantle uses high gas units (up to 5B for complex txs) */\nconst MAX_GAS_LIMIT = 5_000_000_000n; // 5B\n\nexport class Executor {\n readonly dryRun: boolean;\n readonly rpcUrl: string | undefined;\n readonly explorerUrl: string | undefined;\n\n constructor(broadcast: boolean, rpcUrl?: string, explorerUrl?: string) {\n this.dryRun = !broadcast;\n this.rpcUrl = rpcUrl;\n this.explorerUrl = explorerUrl;\n }\n\n /** Apply 20% buffer to a gas estimate */\n private static applyGasBuffer(gas: bigint): bigint {\n return (gas * GAS_BUFFER_BPS) / 10000n;\n }\n\n /**\n * Check allowance for a single token/spender pair and send an approve tx if needed.\n * Only called in broadcast mode (not dry-run).\n */\n private async checkAndApprove(\n token: Address,\n spender: Address,\n amount: bigint,\n owner: Address,\n publicClient: ReturnType<typeof createPublicClient>,\n walletClient: ReturnType<typeof createWalletClient>,\n ): Promise<void> {\n const allowance = await publicClient.readContract({\n address: token,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [owner, spender],\n });\n\n if (allowance >= amount) return;\n\n process.stderr.write(\n ` Approving ${amount} of ${token} for ${spender}...\\n`,\n );\n\n const approveData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [spender, amount],\n });\n\n const rpcUrl = this.rpcUrl!;\n const gasLimit = await (async () => {\n try {\n const estimated = await publicClient.estimateGas({\n to: token,\n data: approveData,\n account: owner,\n });\n const buffered = Executor.applyGasBuffer(estimated);\n return buffered > MAX_GAS_LIMIT ? MAX_GAS_LIMIT : buffered;\n } catch {\n return 80_000n;\n }\n })();\n\n const [maxFeePerGas, maxPriorityFeePerGas] = await this.fetchEip1559Fees(rpcUrl);\n\n const approveTxHash = await walletClient.sendTransaction({\n chain: null,\n account: walletClient.account!,\n to: token,\n data: approveData,\n gas: gasLimit > 0n ? gasLimit : undefined,\n maxFeePerGas: maxFeePerGas > 0n ? maxFeePerGas : undefined,\n maxPriorityFeePerGas: maxPriorityFeePerGas > 0n ? maxPriorityFeePerGas : undefined,\n });\n\n const approveTxUrl = this.explorerUrl\n ? `${this.explorerUrl}/tx/${approveTxHash}`\n : undefined;\n process.stderr.write(` Approve tx: ${approveTxHash}\\n`);\n if (approveTxUrl) process.stderr.write(` Explorer: ${approveTxUrl}\\n`);\n\n await publicClient.waitForTransactionReceipt({ hash: approveTxHash });\n process.stderr.write(\n ` Approved ${amount} of ${token} for ${spender}\\n`,\n );\n }\n\n /** Fetch EIP-1559 fee params from the network. Returns [maxFeePerGas, maxPriorityFeePerGas]. */\n private async fetchEip1559Fees(rpcUrl: string): Promise<[bigint, bigint]> {\n try {\n const client = createPublicClient({ transport: http(rpcUrl) });\n const gasPrice = await client.getGasPrice();\n let priorityFee = DEFAULT_PRIORITY_FEE_WEI;\n try {\n priorityFee = await client.estimateMaxPriorityFeePerGas();\n } catch {\n // fallback to default\n }\n const maxFee = gasPrice * 2n + priorityFee;\n return [maxFee, priorityFee];\n } catch {\n return [0n, 0n];\n }\n }\n\n /** Estimate gas dynamically with buffer, falling back to a hardcoded estimate */\n private async estimateGasWithBuffer(\n rpcUrl: string,\n tx: DeFiTx,\n from: `0x${string}`,\n ): Promise<bigint> {\n try {\n const client = createPublicClient({ transport: http(rpcUrl) });\n const estimated = await client.estimateGas({\n to: tx.to,\n data: tx.data,\n value: tx.value,\n account: from,\n });\n if (estimated > 0n) {\n const buffered = Executor.applyGasBuffer(estimated);\n return buffered > MAX_GAS_LIMIT ? MAX_GAS_LIMIT : buffered;\n }\n } catch {\n // fallback: apply buffer to the hint too\n if (tx.gas_estimate) {\n return Executor.applyGasBuffer(BigInt(tx.gas_estimate));\n }\n }\n return 0n;\n }\n\n /** Simulate a transaction via eth_call + eth_estimateGas */\n private async simulate(tx: DeFiTx): Promise<ActionResult> {\n const rpcUrl = this.rpcUrl;\n if (!rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL — cannot simulate. Set HYPEREVM_RPC_URL.\");\n }\n\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const privateKey = process.env[\"DEFI_PRIVATE_KEY\"];\n const from: `0x${string}` = privateKey\n ? privateKeyToAccount(privateKey as `0x${string}`).address\n : \"0x0000000000000000000000000000000000000001\";\n\n // Check approvals before simulation\n if (tx.approvals && tx.approvals.length > 0) {\n const pendingApprovals: Array<{ token: string; spender: string; needed: string; current: string }> = [];\n for (const approval of tx.approvals) {\n try {\n const allowance = await client.readContract({\n address: approval.token,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [from as `0x${string}`, approval.spender],\n });\n if (allowance < approval.amount) {\n pendingApprovals.push({\n token: approval.token,\n spender: approval.spender,\n needed: approval.amount.toString(),\n current: allowance.toString(),\n });\n }\n } catch { /* skip check on error */ }\n }\n if (pendingApprovals.length > 0) {\n return {\n tx_hash: undefined,\n status: TxStatus.NeedsApproval,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"simulated\",\n result: \"needs_approval\",\n pending_approvals: pendingApprovals,\n hint: \"Use --broadcast to auto-approve and execute\",\n },\n };\n }\n }\n\n try {\n await client.call({ to: tx.to, data: tx.data, value: tx.value, account: from });\n\n const gasEstimate = await this.estimateGasWithBuffer(rpcUrl, tx, from);\n const [maxFee, priorityFee] = await this.fetchEip1559Fees(rpcUrl);\n\n return {\n tx_hash: undefined,\n status: TxStatus.Simulated,\n gas_used: gasEstimate > 0n ? Number(gasEstimate) : undefined,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n gas_estimate: gasEstimate.toString(),\n max_fee_per_gas_gwei: (Number(maxFee) / 1e9).toFixed(4),\n max_priority_fee_gwei: (Number(priorityFee) / 1e9).toFixed(4),\n mode: \"simulated\",\n result: \"success\",\n },\n };\n } catch (e: unknown) {\n const errMsg = String(e);\n const revertReason = extractRevertReason(errMsg);\n\n return {\n tx_hash: undefined,\n status: TxStatus.SimulationFailed,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"simulated\",\n result: \"revert\",\n revert_reason: revertReason,\n },\n };\n }\n }\n\n async execute(tx: DeFiTx): Promise<ActionResult> {\n if (this.dryRun) {\n if (this.rpcUrl) {\n return this.simulate(tx);\n }\n\n return {\n tx_hash: undefined,\n status: TxStatus.DryRun,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"dry_run\",\n },\n };\n }\n\n // === Broadcast mode ===\n const privateKey = process.env[\"DEFI_PRIVATE_KEY\"];\n if (!privateKey) {\n throw DefiError.invalidParam(\n \"DEFI_PRIVATE_KEY environment variable not set. Required for --broadcast.\",\n );\n }\n\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n\n const rpcUrl = this.rpcUrl;\n if (!rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured for broadcasting\");\n }\n\n const publicClient = createPublicClient({ transport: http(rpcUrl) });\n const walletClient = createWalletClient({ account, transport: http(rpcUrl) });\n\n // Execute pre-transactions (e.g. farming approval)\n if (tx.pre_txs && tx.pre_txs.length > 0) {\n for (const preTx of tx.pre_txs) {\n process.stderr.write(` Pre-tx: ${preTx.description}...\\n`);\n const preGas = await this.estimateGasWithBuffer(rpcUrl, preTx, account.address);\n const preTxHash = await walletClient.sendTransaction({\n chain: null,\n to: preTx.to,\n data: preTx.data,\n value: preTx.value,\n gas: preGas > 0n ? preGas : undefined,\n });\n const preTxUrl = this.explorerUrl ? `${this.explorerUrl}/tx/${preTxHash}` : undefined;\n process.stderr.write(` Pre-tx sent: ${preTxHash}\\n`);\n if (preTxUrl) process.stderr.write(` Explorer: ${preTxUrl}\\n`);\n const preReceipt = await publicClient.waitForTransactionReceipt({ hash: preTxHash });\n if (preReceipt.status !== \"success\") {\n throw new DefiError(\"TX_FAILED\", `Pre-transaction failed: ${preTx.description}`);\n }\n process.stderr.write(` Pre-tx confirmed\\n`);\n }\n }\n\n // Auto-approve ERC20 tokens if needed\n if (tx.approvals && tx.approvals.length > 0) {\n for (const approval of tx.approvals) {\n await this.checkAndApprove(\n approval.token,\n approval.spender,\n approval.amount,\n account.address,\n publicClient,\n walletClient,\n );\n }\n }\n\n // Dynamic gas estimation with buffer\n const gasLimit = await this.estimateGasWithBuffer(rpcUrl, tx, account.address);\n\n // EIP-1559 gas pricing\n const [maxFeePerGas, maxPriorityFeePerGas] = await this.fetchEip1559Fees(rpcUrl);\n\n process.stderr.write(`Broadcasting transaction to ${rpcUrl}...\\n`);\n if (gasLimit > 0n) {\n process.stderr.write(` Gas limit: ${gasLimit} (with 20% buffer)\\n`);\n }\n\n const txHash = await walletClient.sendTransaction({\n chain: null,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n gas: gasLimit > 0n ? gasLimit : undefined,\n maxFeePerGas: maxFeePerGas > 0n ? maxFeePerGas : undefined,\n maxPriorityFeePerGas: maxPriorityFeePerGas > 0n ? maxPriorityFeePerGas : undefined,\n });\n\n const txUrl = this.explorerUrl ? `${this.explorerUrl}/tx/${txHash}` : undefined;\n process.stderr.write(`Transaction sent: ${txHash}\\n`);\n if (txUrl) process.stderr.write(`Explorer: ${txUrl}\\n`);\n process.stderr.write(\"Waiting for confirmation...\\n\");\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n const status = receipt.status === \"success\" ? TxStatus.Confirmed : TxStatus.Failed;\n\n // Extract minted NFT tokenId from Transfer(from=0x0) events\n let mintedTokenId: string | undefined;\n if (receipt.status === \"success\" && receipt.logs) {\n const TRANSFER_TOPIC = \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\";\n const ZERO_TOPIC = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n for (const log of receipt.logs) {\n if (\n log.topics.length >= 4 &&\n log.topics[0] === TRANSFER_TOPIC &&\n log.topics[1] === ZERO_TOPIC // from = address(0) → mint\n ) {\n mintedTokenId = BigInt(log.topics[3]!).toString();\n break;\n }\n }\n }\n\n const details: Record<string, string | undefined> = {\n to: tx.to,\n from: account.address,\n block_number: receipt.blockNumber?.toString(),\n gas_limit: gasLimit.toString(),\n gas_used: receipt.gasUsed?.toString(),\n explorer_url: txUrl,\n mode: \"broadcast\",\n };\n if (mintedTokenId) {\n details.minted_token_id = mintedTokenId;\n process.stderr.write(` Minted NFT tokenId: ${mintedTokenId}\\n`);\n }\n\n return {\n tx_hash: txHash,\n status,\n gas_used: receipt.gasUsed ? Number(receipt.gasUsed) : undefined,\n description: tx.description,\n details,\n };\n }\n}\n\n/** Extract a human-readable revert reason from an RPC error message */\nfunction extractRevertReason(err: string): string {\n for (const marker of [\"execution reverted:\", \"revert:\", \"Error(\"]) {\n const pos = err.indexOf(marker);\n if (pos !== -1) return err.slice(pos);\n }\n return err.length > 200 ? err.slice(0, 200) + \"...\" : err;\n}\n","import { jsonStringify, jsonReplacerDecimal } from \"@hypurrquant/defi-core\";\nimport { renderTable } from \"./table.js\";\n\nexport interface OutputMode {\n json: boolean;\n ndjson: boolean;\n fields?: string[];\n}\n\nexport function parseOutputMode(opts: {\n json?: boolean;\n ndjson?: boolean;\n fields?: string;\n}): OutputMode {\n return {\n json: !!(opts.json || opts.ndjson),\n ndjson: !!opts.ndjson,\n fields: opts.fields\n ? opts.fields.split(\",\").map((f) => f.trim())\n : undefined,\n };\n}\n\nexport function formatOutput(value: unknown, mode: OutputMode): string {\n if (mode.ndjson) {\n return JSON.stringify(value, jsonReplacerDecimal);\n }\n\n if (mode.json) {\n let jsonVal = JSON.parse(jsonStringify(value));\n\n if (mode.fields && typeof jsonVal === \"object\" && jsonVal !== null && !Array.isArray(jsonVal)) {\n const filtered: Record<string, unknown> = {};\n for (const key of mode.fields) {\n if (key in jsonVal) filtered[key] = jsonVal[key];\n }\n jsonVal = filtered;\n }\n\n return JSON.stringify(jsonVal, null, 2);\n }\n\n // Human-readable: try table format, fallback to pretty JSON\n const jsonVal = JSON.parse(jsonStringify(value));\n const table = renderTable(jsonVal);\n if (table !== null) return table;\n return JSON.stringify(jsonVal, null, 2);\n}\n\nexport function printOutput(value: unknown, mode: OutputMode): void {\n console.log(formatOutput(value, mode));\n}\n","import pc from \"picocolors\";\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\n/** Try to render a JSON value as a human-readable table. Returns null if shape isn't recognized. */\nexport function renderTable(value: JsonValue): string | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return null;\n\n const v = value as Record<string, JsonValue>;\n\n if (\"alerts\" in v && \"scan_duration_ms\" in v) return renderScan(v);\n if (\"holders\" in v) return renderWhales(v);\n if (\"opportunities\" in v && \"total_opportunities\" in v) return renderCompare(v);\n if (\"arb_opportunities\" in v && \"rates\" in v) return renderYieldScan(v);\n if (\"rates\" in v && \"asset\" in v) return renderYield(v);\n if (\"chains\" in v && \"total_alerts\" in v) return renderScanAll(v);\n if (\"chains\" in v && \"chains_scanned\" in v) return renderPositions(v);\n if (\"bridge\" in v && \"amount_out\" in v) return renderBridge(v);\n if (\"aggregator\" in v && \"amount_out\" in v) return renderSwap(v);\n if (\"protocols\" in v && \"summary\" in v) return renderStatus(v);\n if (\"token_balances\" in v && \"lending_positions\" in v) return renderPortfolio(v);\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Simple table helpers (no external dep)\n// ---------------------------------------------------------------------------\n\nfunction makeTable(headers: string[], rows: string[][]): string {\n const colWidths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? \"\").replace(/\\x1b\\[[0-9;]*m/g, \"\").length))\n );\n\n const sep = \"┼\" + colWidths.map((w) => \"─\".repeat(w + 2)).join(\"┼\") + \"┼\";\n const topBorder = \"┌\" + colWidths.map((w) => \"─\".repeat(w + 2)).join(\"┬\") + \"┐\";\n const midBorder = \"├\" + colWidths.map((w) => \"─\".repeat(w + 2)).join(\"┼\") + \"┤\";\n const botBorder = \"└\" + colWidths.map((w) => \"─\".repeat(w + 2)).join(\"┴\") + \"┘\";\n\n function padCell(text: string, width: number): string {\n const visLen = text.replace(/\\x1b\\[[0-9;]*m/g, \"\").length;\n return text + \" \".repeat(Math.max(0, width - visLen));\n }\n\n const headerRow = \"│ \" + headers.map((h, i) => padCell(pc.bold(h), colWidths[i])).join(\" │ \") + \" │\";\n const dataRows = rows.map(\n (row) => \"│ \" + row.map((cell, i) => padCell(cell ?? \"\", colWidths[i])).join(\" │ \") + \" │\"\n );\n\n return [topBorder, headerRow, midBorder, ...dataRows, botBorder].join(\"\\n\");\n}\n\nfunction asStr(v: JsonValue | undefined): string {\n if (v === undefined || v === null) return \"?\";\n return String(v);\n}\n\nfunction asF64(v: JsonValue | undefined): number {\n if (typeof v === \"number\") return v;\n if (typeof v === \"string\") return parseFloat(v) || 0;\n return 0;\n}\n\nfunction asU64(v: JsonValue | undefined): number {\n if (typeof v === \"number\") return Math.floor(v);\n if (typeof v === \"string\") return parseInt(v, 10) || 0;\n return 0;\n}\n\nfunction asArr(v: JsonValue | undefined): JsonValue[] {\n if (Array.isArray(v)) return v;\n return [];\n}\n\nfunction asObj(v: JsonValue | undefined): Record<string, JsonValue> {\n if (v && typeof v === \"object\" && !Array.isArray(v)) return v as Record<string, JsonValue>;\n return {};\n}\n\nfunction formatPrice(v: JsonValue | undefined): string {\n const p = asF64(v);\n if (p === 0) return \"?\";\n return p > 1000 ? `$${p.toFixed(0)}` : `$${p.toFixed(4)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Renderers\n// ---------------------------------------------------------------------------\n\nfunction renderScan(v: Record<string, JsonValue>): string {\n const chain = asStr(v[\"chain\"]);\n const ms = asU64(v[\"scan_duration_ms\"]);\n const count = asU64(v[\"alert_count\"]);\n let out = ` Scan: ${chain} (${ms} ms)\\n`;\n\n if (count > 0) {\n const rows = asArr(v[\"alerts\"]).map((a) => {\n const ao = asObj(a as JsonValue);\n const sev = asStr(ao[\"severity\"]);\n const color = sev === \"critical\" ? pc.red : sev === \"high\" ? pc.yellow : pc.cyan;\n return [\n color(sev.toUpperCase()),\n asStr(ao[\"pattern\"]),\n asStr(ao[\"asset\"]),\n formatPrice(ao[\"oracle_price\"]),\n formatPrice(ao[\"dex_price\"]),\n `${asF64(ao[\"deviation_pct\"]).toFixed(1)}%`,\n ];\n });\n out += makeTable([\"Severity\", \"Pattern\", \"Asset\", \"Oracle\", \"DEX\", \"Gap\"], rows);\n } else {\n out += ` ${count} alerts\\n`;\n }\n\n const data = asObj(v[\"data\"]);\n const o = Object.keys(asObj(data[\"oracle_prices\"])).length;\n const d = Object.keys(asObj(data[\"dex_prices\"])).length;\n const s = Object.keys(asObj(data[\"stablecoin_pegs\"])).length;\n out += `\\n Data: ${o} oracle, ${d} dex, ${s} stablecoin prices`;\n return out;\n}\n\nfunction renderScanAll(v: Record<string, JsonValue>): string {\n const total = asU64(v[\"total_alerts\"]);\n const scanned = asU64(v[\"chains_scanned\"]);\n const ms = asU64(v[\"scan_duration_ms\"]);\n\n const rows = asArr(v[\"chains\"]).map((c) => {\n const co = asObj(c as JsonValue);\n const alerts = asU64(co[\"alert_count\"]);\n const cms = asU64(co[\"scan_duration_ms\"]);\n const details = asArr(co[\"alerts\"])\n .map((a) => asStr(asObj(a as JsonValue)[\"asset\"]))\n .join(\", \") || \"clean\";\n const alertStr = alerts > 0 ? pc.yellow(String(alerts)) : pc.green(String(alerts));\n return [asStr(co[\"chain\"]), alertStr, `${cms}ms`, details];\n });\n\n return ` All-chain scan: ${scanned} chains, ${total} alerts, ${ms}ms\\n\\n` +\n makeTable([\"Chain\", \"Alerts\", \"Time\", \"Details\"], rows);\n}\n\nfunction renderWhales(v: Record<string, JsonValue>): string {\n const chain = asStr(v[\"chain\"]);\n const token = asStr(v[\"token\"]);\n\n const rows = asArr(v[\"holders\"]).map((h) => {\n const ho = asObj(h as JsonValue);\n const addr = asStr(ho[\"address\"]);\n const short = addr.length > 18 ? `${addr.slice(0, 10)}...${addr.slice(-6)}` : addr;\n return [String(asU64(ho[\"rank\"])), short, asF64(ho[\"balance\"]).toFixed(2)];\n });\n\n return ` ${chain} ${token} Top Holders\\n\\n` + makeTable([\"#\", \"Address\", `${token} Balance`], rows);\n}\n\nfunction renderYield(v: Record<string, JsonValue>): string {\n const chain = asStr(v[\"chain\"]);\n const asset = asStr(v[\"asset\"]);\n\n const rows = asArr(v[\"rates\"]).map((r) => {\n const ro = asObj(r as JsonValue);\n const supply = asF64(ro[\"supply_apy\"]);\n const borrow = asF64(ro[\"borrow_variable_apy\"]);\n const color = supply > 3 ? pc.green : supply > 1 ? pc.cyan : (s: string) => s;\n return [asStr(ro[\"protocol\"]), color(`${supply.toFixed(2)}%`), `${borrow.toFixed(2)}%`];\n });\n\n const best = asStr(v[\"best_supply\"]);\n return ` ${chain} ${asset} Yield Comparison (best: ${best})\\n\\n` +\n makeTable([\"Protocol\", \"Supply APY\", \"Borrow APY\"], rows);\n}\n\nfunction renderPositions(v: Record<string, JsonValue>): string {\n const addr = asStr(v[\"address\"]);\n const summary = asObj(v[\"summary\"]);\n const total = asF64(v[\"total_value_usd\"] ?? summary[\"total_value_usd\"]);\n const ms = asU64(v[\"scan_duration_ms\"]);\n const scanned = asU64(v[\"chains_scanned\"]);\n\n let out = ` Positions for ${addr.slice(0, 8)}...${addr.slice(-4)} (${ms}ms, ${scanned} chains)\\n Total: $${total.toFixed(2)}\\n\\n`;\n\n for (const c of asArr(v[\"chains\"])) {\n const co = asObj(c as JsonValue);\n const chain = asStr(co[\"chain\"]);\n const ctotal = asF64(co[\"chain_total_usd\"]);\n out += ` ${chain} ($${ctotal.toFixed(2)})\\n`;\n\n const rows: string[][] = [];\n for (const b of asArr(co[\"token_balances\"])) {\n const bo = asObj(b as JsonValue);\n rows.push([\"wallet\", asStr(bo[\"symbol\"]), pc.green(`$${asF64(bo[\"value_usd\"]).toFixed(2)}`)]);\n }\n for (const l of asArr(co[\"lending_positions\"])) {\n const lo = asObj(l as JsonValue);\n const coll = asF64(lo[\"collateral_usd\"]);\n const debt = asF64(lo[\"debt_usd\"]);\n rows.push([\"lending\", asStr(lo[\"protocol\"]), pc.cyan(`coll $${coll.toFixed(0)} debt $${debt.toFixed(0)}`)]);\n }\n out += makeTable([\"Type\", \"Asset/Protocol\", \"Value\"], rows) + \"\\n\";\n }\n return out;\n}\n\nfunction renderSwap(v: Record<string, JsonValue>): string {\n const from = asStr(v[\"from\"]);\n const to = asStr(v[\"to\"]);\n const amtIn = asF64(v[\"amount_in\"]);\n const amtOut = asF64(v[\"amount_out\"]);\n const impact = typeof v[\"price_impact_pct\"] === \"number\"\n ? `${asF64(v[\"price_impact_pct\"]).toFixed(4)}%`\n : \"n/a\";\n const agg = asStr(v[\"aggregator\"]);\n const chain = asStr(v[\"chain\"]);\n return ` Swap on ${chain} via ${agg}\\n\\n ${amtIn} ${from} -> ${amtOut.toFixed(6)} ${to}\\n Price impact: ${impact}\\n`;\n}\n\nfunction renderBridge(v: Record<string, JsonValue>): string {\n const from = asStr(v[\"from_chain\"]);\n const to = asStr(v[\"to_chain\"]);\n const token = asStr(v[\"token\"]);\n const amtIn = asF64(v[\"amount_in\"]);\n const amtOut = asF64(v[\"amount_out\"]);\n const cost = asF64(v[\"total_cost_usd\"]);\n const time = asU64(v[\"estimated_time_sec\"]);\n const bridge = asStr(v[\"bridge\"]);\n return ` Bridge ${from} -> ${to} via ${bridge}\\n\\n ${amtIn} ${token} -> ${amtOut.toFixed(6)} ${token}\\n Cost: $${cost.toFixed(2)} | Time: ${time}s\\n`;\n}\n\nfunction renderStatus(v: Record<string, JsonValue>): string {\n const chain = asStr(v[\"chain\"]);\n const summary = asObj(v[\"summary\"]);\n const totalP = asU64(summary[\"total_protocols\"]);\n const totalT = asU64(summary[\"total_tokens\"]);\n\n const rows = asArr(v[\"protocols\"]).map((p) => {\n const po = asObj(p as JsonValue);\n return [asStr(po[\"name\"]), asStr(po[\"category\"]), asStr(po[\"interface\"])];\n });\n\n const tokens = asArr(v[\"tokens\"]).map((t) => String(t)).filter(Boolean);\n let out = ` ${chain} — ${totalP} protocols`;\n if (tokens.length > 0) {\n out += `, ${totalT} tokens\\n Tokens: ${tokens.join(\", \")}`;\n }\n return `${out}\\n\\n` + makeTable([\"Protocol\", \"Category\", \"Interface\"], rows);\n}\n\nfunction renderCompare(v: Record<string, JsonValue>): string {\n const asset = asStr(v[\"asset\"]);\n const ms = asU64(v[\"scan_duration_ms\"]);\n const total = asU64(v[\"total_opportunities\"]);\n\n const rows = asArr(v[\"opportunities\"]).map((opp) => {\n const oo = asObj(opp as JsonValue);\n const typ = asStr(oo[\"type\"]);\n const apy = asF64(oo[\"apy\"]);\n const detail = asStr(oo[\"detail\"]);\n const risk = asStr(oo[\"risk\"]);\n const oppAsset = asStr(oo[\"asset\"]);\n\n const typeLabel = typ === \"perp_funding\" ? \"Perp Arb\"\n : typ === \"perp_rate\" ? \"Perp Rate\"\n : typ === \"lending_supply\" ? \"Lending\"\n : typ;\n\n const apyColor = Math.abs(apy) > 20 ? pc.green : Math.abs(apy) > 5 ? pc.cyan : (s: string) => s;\n const riskColor = risk === \"high\" ? pc.red : risk === \"medium\" ? pc.yellow : pc.green;\n\n return [typeLabel, oppAsset, apyColor(`${apy.toFixed(1)}%`), detail, riskColor(risk)];\n });\n\n return ` Yield Compare: ${asset} (${total} opportunities, ${ms}ms)\\n\\n` +\n makeTable([\"Type\", \"Asset\", \"APY\", \"Where\", \"Risk\"], rows);\n}\n\nfunction renderYieldScan(v: Record<string, JsonValue>): string {\n const asset = asStr(v[\"asset\"]);\n const ms = asU64(v[\"scan_duration_ms\"]);\n const best = asStr(v[\"best_supply\"]);\n\n const rows = asArr(v[\"rates\"]).map((r) => {\n const ro = asObj(r as JsonValue);\n const supply = asF64(ro[\"supply_apy\"]);\n const borrow = asF64(ro[\"borrow_variable_apy\"]);\n const color = supply > 3 ? pc.green : supply > 1 ? pc.cyan : (s: string) => s;\n return [asStr(ro[\"chain\"]), asStr(ro[\"protocol\"]), color(`${supply.toFixed(2)}%`), `${borrow.toFixed(2)}%`];\n });\n\n let out = ` ${asset} Yield Scan (${ms}ms) — Best: ${best}\\n\\n` +\n makeTable([\"Chain\", \"Protocol\", \"Supply APY\", \"Borrow APY\"], rows);\n\n const arbs = asArr(v[\"arb_opportunities\"]);\n if (arbs.length > 0) {\n const arbRows = arbs.map((a) => {\n const ao = asObj(a as JsonValue);\n const spread = asF64(ao[\"spread_pct\"]);\n const color = spread > 1 ? pc.green : pc.cyan;\n return [\n color(`+${spread.toFixed(2)}%`),\n `${asStr(ao[\"supply_protocol\"])} (${asStr(ao[\"supply_chain\"])})`,\n `${asStr(ao[\"borrow_protocol\"])} (${asStr(ao[\"borrow_chain\"])})`,\n asStr(ao[\"strategy\"]),\n ];\n });\n out += \"\\n Arb Opportunities\\n\\n\" + makeTable([\"Spread\", \"Supply @\", \"Borrow @\", \"Type\"], arbRows);\n }\n\n return out;\n}\n\nfunction renderPortfolio(v: Record<string, JsonValue>): string {\n return renderPositions(v);\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\nimport { createPublicClient, http } from \"viem\";\n\ninterface ContractStatus {\n name: string;\n address: string;\n has_code?: boolean;\n status?: string;\n}\n\ninterface ProtocolStatus {\n slug: string;\n name: string;\n category: string;\n interface: string;\n contracts: ContractStatus[];\n}\n\ninterface StatusSummary {\n total_protocols: number;\n verified_contracts?: number;\n invalid_contracts?: number;\n placeholder_contracts?: number;\n}\n\ninterface StatusOutput {\n chain: string;\n chain_id: number;\n rpc_url: string;\n block_number?: number;\n protocols: ProtocolStatus[];\n summary: StatusSummary;\n}\n\nfunction isPlaceholder(addr: string): boolean {\n if (!addr.startsWith(\"0x\") || addr.length !== 42) return false;\n const hex = addr.slice(2).toLowerCase();\n return hex.slice(0, 36).split(\"\").every((c) => c === \"0\") && parseInt(hex.slice(36), 16) <= 0x10;\n}\n\nexport function registerStatus(\n parent: Command,\n getOpts: () => OutputMode,\n): void {\n parent\n .command(\"status\")\n .description(\"Show chain and protocol status\")\n .option(\"--verify\", \"Verify contract addresses on-chain\")\n .action(async (opts) => {\n const globalOpts = parent.opts<{ chain?: string }>();\n const registry = Registry.loadEmbedded();\n\n const chainKeys = globalOpts.chain\n ? [globalOpts.chain]\n : Array.from(registry.chains.keys());\n\n if (chainKeys.length > 1) {\n // Multi-chain summary\n const summary: unknown[] = [];\n for (const ck of chainKeys) {\n const cc = registry.getChain(ck);\n const protos = registry.getProtocolsForChain(ck);\n summary.push({\n chain: cc.name,\n chain_id: cc.chain_id,\n rpc_url: cc.effectiveRpcUrl(),\n protocols: protos.map(p => ({ slug: p.slug, name: p.name, category: p.category, interface: p.interface })),\n summary: { total_protocols: protos.length },\n });\n }\n printOutput(summary, getOpts());\n return;\n }\n\n const chainName = chainKeys[0]!;\n const chainConfig = registry.getChain(chainName);\n const chainProtocols = registry.getProtocolsForChain(chainName);\n\n let blockNumber: number | undefined;\n let codeMap: Map<string, boolean> | undefined;\n let placeholderCount = 0;\n\n // Count placeholders\n for (const p of chainProtocols) {\n for (const addr of Object.values(p.contracts ?? {}) as string[]) {\n if (isPlaceholder(addr)) placeholderCount++;\n }\n }\n\n if (opts.verify) {\n const rpcUrl = chainConfig.effectiveRpcUrl();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n try {\n const bn = await client.getBlockNumber();\n blockNumber = Number(bn);\n process.stderr.write(\n `Connected to ${rpcUrl} (block #${blockNumber}). Verifying contracts...\\n`,\n );\n } catch (e) {\n process.stderr.write(`Warning: could not get block number\\n`);\n }\n\n codeMap = new Map();\n const allAddrs: Array<{ key: string; addr: Address }> = [];\n\n for (const p of chainProtocols) {\n for (const [name, addr] of Object.entries(p.contracts ?? {}) as [string, string][]) {\n if (!isPlaceholder(addr)) {\n allAddrs.push({ key: `${p.name}:${name}`, addr: addr as Address });\n }\n }\n }\n\n // Batch verify in chunks of 20\n for (let i = 0; i < allAddrs.length; i += 20) {\n const chunk = allAddrs.slice(i, i + 20);\n const results = await Promise.all(\n chunk.map(async ({ key, addr }) => {\n try {\n const code = await client.getCode({ address: addr as `0x${string}` });\n return { key, hasCode: !!code && code !== \"0x\" };\n } catch {\n return { key, hasCode: false };\n }\n }),\n );\n for (const r of results) {\n codeMap.set(r.key, r.hasCode);\n }\n }\n }\n\n // Build output\n let verifiedCount = 0;\n let invalidCount = 0;\n\n const protocols: ProtocolStatus[] = chainProtocols.map((p) => {\n const contracts: ContractStatus[] = (Object.entries(p.contracts ?? {}) as [string, string][]).map(\n ([name, addr]) => {\n if (isPlaceholder(addr)) {\n return { name, address: addr, status: \"placeholder\" };\n }\n if (codeMap) {\n const hasCode = codeMap.get(`${p.name}:${name}`) ?? false;\n if (hasCode) verifiedCount++;\n else invalidCount++;\n return {\n name,\n address: addr,\n has_code: hasCode,\n status: hasCode ? \"verified\" : \"NO_CODE\",\n };\n }\n return { name, address: addr };\n },\n );\n\n return {\n slug: p.slug,\n name: p.name,\n category: p.category,\n interface: p.interface,\n contracts,\n };\n });\n\n const output: StatusOutput = {\n chain: chainConfig.name,\n chain_id: chainConfig.chain_id,\n rpc_url: chainConfig.effectiveRpcUrl(),\n ...(blockNumber !== undefined ? { block_number: blockNumber } : {}),\n protocols,\n summary: {\n total_protocols: protocols.length,\n ...(opts.verify\n ? {\n verified_contracts: verifiedCount,\n invalid_contracts: invalidCount,\n placeholder_contracts: placeholderCount,\n }\n : {}),\n },\n };\n\n printOutput(output, getOpts());\n });\n}\n","import * as readline from \"readline\";\nimport type { Executor } from \"./executor.js\";\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type { Registry } from \"@hypurrquant/defi-core\";\n\nexport interface AgentCommand {\n action: string;\n params: unknown;\n}\n\nexport interface AgentResponse {\n action: string;\n success: boolean;\n result?: unknown;\n error?: string;\n}\n\nexport async function runAgent(registry: Registry, executor: Executor): Promise<void> {\n const rl = readline.createInterface({ input: process.stdin, terminal: false });\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let cmd: AgentCommand;\n try {\n cmd = JSON.parse(trimmed) as AgentCommand;\n } catch (e: unknown) {\n const resp: AgentResponse = {\n action: \"unknown\",\n success: false,\n error: `Invalid JSON: ${e instanceof Error ? e.message : String(e)}`,\n };\n console.log(JSON.stringify(resp));\n continue;\n }\n\n const resp = await dispatchCommand(cmd, registry, executor);\n console.log(JSON.stringify(resp));\n }\n}\n\nasync function dispatchCommand(\n cmd: AgentCommand,\n registry: Registry,\n executor: Executor,\n): Promise<AgentResponse> {\n try {\n const result = await handleAction(cmd.action, cmd.params, registry, executor);\n return { action: cmd.action, success: true, result };\n } catch (e: unknown) {\n return {\n action: cmd.action,\n success: false,\n error: e instanceof Error ? e.message : String(e),\n };\n }\n}\n\nasync function handleAction(\n action: string,\n params: unknown,\n registry: Registry,\n executor: Executor,\n): Promise<unknown> {\n const p = (params ?? {}) as Record<string, unknown>;\n\n switch (action) {\n case \"status\":\n return handleStatus(registry);\n\n case \"list_protocols\":\n return handleListProtocols(registry, p);\n\n case \"schema\":\n return handleSchema(p);\n\n case \"yield\":\n case \"lending.rates\":\n case \"lending.position\":\n case \"lending.supply\":\n case \"lending.borrow\":\n case \"lending.repay\":\n case \"lending.withdraw\":\n case \"lp.discover\":\n case \"lp.add\":\n case \"lp.farm\":\n case \"lp.claim\":\n case \"lp.remove\":\n case \"swap\":\n case \"price\":\n case \"token.balance\":\n case \"token.approve\":\n case \"token.transfer\":\n case \"wallet.balance\":\n case \"portfolio.show\":\n case \"bridge\":\n throw DefiError.unsupported(`Agent action '${action}' — use CLI commands directly (e.g. defi --chain hyperevm lending rates --protocol hypurrfi --asset USDC)`);\n\n default:\n throw DefiError.unsupported(`Unknown action: ${action}`);\n }\n}\n\nfunction handleStatus(registry: Registry): unknown {\n const chain = registry.getChain(\"hyperevm\");\n const protocols = registry.protocols.map((p) => ({\n name: p.name,\n slug: p.slug,\n category: p.category,\n interface: p.interface,\n native: p.native,\n }));\n\n return {\n chain: chain.name,\n chain_id: chain.chain_id,\n protocol_count: protocols.length,\n protocols,\n };\n}\n\nfunction handleListProtocols(registry: Registry, params: Record<string, unknown>): unknown {\n const categoryFilter = typeof params[\"category\"] === \"string\" ? params[\"category\"] : undefined;\n\n const protocols = registry.protocols\n .filter((p) => !categoryFilter || p.category.toLowerCase() === categoryFilter.toLowerCase())\n .map((p) => ({\n name: p.name,\n slug: p.slug,\n category: p.category,\n interface: p.interface,\n }));\n\n return { protocols };\n}\n\nexport function handleSchema(params: Record<string, unknown>): unknown {\n const action = typeof params[\"action\"] === \"string\" ? params[\"action\"] : \"all\";\n\n switch (action) {\n case \"status\":\n return { action: \"status\", params: {}, cli: \"defi status\" };\n\n case \"list_protocols\":\n return {\n action: \"list_protocols\",\n params: {\n category: { type: \"string\", required: false, description: \"Filter by category (e.g. dex, lending)\" },\n },\n cli: \"defi status\",\n };\n\n case \"yield\":\n return {\n action: \"yield\",\n params: {\n chain: { type: \"string\", required: false, description: \"Target chain (omit for all chains)\" },\n asset: { type: \"string\", required: false, default: \"USDC\", description: \"Token symbol\" },\n },\n cli: \"defi yield --asset USDC\",\n };\n\n case \"lending.rates\":\n return {\n action: \"lending.rates\",\n params: {\n chain: { type: \"string\", required: true, description: \"Target chain\" },\n protocol: { type: \"string\", required: true, description: \"Protocol slug\" },\n asset: { type: \"string\", required: true, description: \"Token symbol or address\" },\n },\n cli: \"defi --chain hyperevm lending rates --protocol hypurrfi --asset USDC\",\n };\n\n case \"lending.supply\":\n case \"lending.borrow\":\n case \"lending.repay\":\n case \"lending.withdraw\":\n return {\n action,\n params: {\n chain: { type: \"string\", required: true, description: \"Target chain\" },\n protocol: { type: \"string\", required: true, description: \"Protocol slug\" },\n asset: { type: \"string\", required: true, description: \"Token symbol or address\" },\n amount: { type: \"string\", required: true, description: \"Amount in wei\" },\n },\n cli: `defi --chain hyperevm lending ${action.split(\".\")[1]} --protocol hypurrfi --asset USDC --amount 1000000`,\n };\n\n case \"lp.discover\":\n return {\n action: \"lp.discover\",\n params: {\n chain: { type: \"string\", required: true, description: \"Target chain\" },\n protocol: { type: \"string\", required: false, description: \"Filter by protocol slug\" },\n },\n cli: \"defi --chain hyperevm lp discover\",\n };\n\n case \"swap\":\n return {\n action: \"swap\",\n params: {\n chain: { type: \"string\", required: true, description: \"Target chain\" },\n from: { type: \"string\", required: true, description: \"Input token symbol or address\" },\n to: { type: \"string\", required: true, description: \"Output token symbol or address\" },\n amount: { type: \"string\", required: true, description: \"Amount in wei\" },\n provider: { type: \"string\", required: false, default: \"kyber\", description: \"Aggregator: kyber, openocean, liquid\" },\n slippage: { type: \"string\", required: false, default: \"50\", description: \"Slippage in bps\" },\n },\n cli: \"defi --chain hyperevm swap --from USDC --to WHYPE --amount 1000000\",\n };\n\n case \"price\":\n return {\n action: \"price\",\n params: {\n chain: { type: \"string\", required: true, description: \"Target chain\" },\n asset: { type: \"string\", required: true, description: \"Token symbol or address\" },\n },\n cli: \"defi --chain hyperevm price --asset WHYPE\",\n };\n\n case \"bridge\":\n return {\n action: \"bridge\",\n params: {\n chain: { type: \"string\", required: true, description: \"Source chain\" },\n token: { type: \"string\", required: true, description: \"Token symbol or address\" },\n amount: { type: \"string\", required: true, description: \"Amount in wei\" },\n to_chain: { type: \"string\", required: true, description: \"Destination chain\" },\n },\n cli: \"defi --chain hyperevm bridge --token USDC --amount 1000000 --to-chain mantle\",\n };\n\n default:\n return {\n actions: [\n \"status\", \"list_protocols\", \"schema\",\n \"yield\",\n \"lending.rates\", \"lending.supply\", \"lending.borrow\", \"lending.repay\", \"lending.withdraw\",\n \"lp.discover\", \"lp.add\", \"lp.farm\", \"lp.claim\", \"lp.remove\",\n \"swap\", \"price\",\n \"token.balance\", \"token.approve\", \"token.transfer\",\n \"wallet.balance\",\n \"portfolio.show\",\n \"bridge\",\n ],\n };\n }\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { handleSchema } from \"../agent.js\";\n\nexport function registerSchema(parent: Command, getOpts: () => OutputMode): void {\n parent\n .command(\"schema [command]\")\n .description(\"Output JSON schema for a command (agent-friendly)\")\n .option(\"--all\", \"Show all schemas\")\n .action(async (command: string | undefined, opts: { all?: boolean }) => {\n const mode = getOpts();\n const action = opts.all ? \"all\" : (command ?? \"all\");\n const params: Record<string, unknown> = { action };\n const schema = handleSchema(params);\n printOutput(schema, mode);\n });\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport type { Executor } from \"../executor.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry, ProtocolCategory } from \"@hypurrquant/defi-core\";\nimport type { Address, Hex } from \"viem\";\nimport { parseAbi, encodeFunctionData, decodeFunctionResult, createPublicClient, http, zeroAddress } from \"viem\";\nimport { multicallRead, decodeU256 } from \"@hypurrquant/defi-core\";\nimport {\n createDex,\n createGauge,\n createKittenSwapFarming,\n createMerchantMoeLB,\n createLending,\n createNestOffChain,\n} from \"@hypurrquant/defi-protocols\";\nimport { loadWhitelist } from \"../whitelist.js\";\nimport type { WhitelistEntry } from \"../whitelist.js\";\nimport { resolveWalletWithSigner } from \"../signer/resolve.js\";\n\n/** Resolve the wallet owner address from options or env vars (including OWS wallets) */\nfunction resolveAccount(optOwner?: string, optWallet?: string): Address {\n if (optOwner) return optOwner as Address;\n const { address } = resolveWalletWithSigner(optWallet ? { wallet: optWallet } : undefined);\n return address;\n}\n\ninterface PipelineStep {\n step: \"mint\" | \"stake\" | \"claim\" | \"collect\";\n function: string;\n optional?: boolean;\n note?: string;\n cli_command?: string;\n}\n\ninterface PipelineInput {\n chain?: string;\n pool?: string;\n tokenA?: string;\n tokenB?: string;\n amountA?: string;\n amountB?: string;\n tickLower?: string;\n tickUpper?: string;\n range?: string;\n tokenId?: string;\n gauge?: string;\n}\n\n/** Build a CLI command string with provided args inlined and `<placeholder>` for unknowns */\nfunction buildCmd(parts: Array<[string, string | undefined, string]>): string {\n // parts: [flag, value, placeholder]\n const segs: string[] = [];\n for (const [flag, value, placeholder] of parts) {\n segs.push(`${flag} ${value ?? `<${placeholder}>`}`);\n }\n return segs.join(\" \");\n}\n\n/**\n * Translate a protocol's reward_strategy into the on-chain function sequence\n * a caller must execute. cli_command fields are filled with provided args\n * (or `<placeholder>` for unknown values).\n */\nfunction buildPipelineSteps(\n p: { slug: string; reward_strategy?: string },\n input: PipelineInput = {},\n): PipelineStep[] {\n const slug = p.slug;\n const chainFlag = input.chain ? `--chain ${input.chain} ` : \"\";\n const baseAdd = `defi ${chainFlag}lp add ` + buildCmd([\n [\"--protocol\", slug, \"slug\"],\n [\"--token-a\", input.tokenA, \"token-a\"],\n [\"--token-b\", input.tokenB, \"token-b\"],\n [\"--amount-a\", input.amountA, \"amount-a\"],\n [\"--amount-b\", input.amountB, \"amount-b\"],\n ...(input.pool ? [[\"--pool\", input.pool, \"pool\"] as [string, string, string]] : []),\n ...(input.tickLower ? [[\"--tick-lower\", input.tickLower, \"tick-lower\"] as [string, string, string]] : []),\n ...(input.tickUpper ? [[\"--tick-upper\", input.tickUpper, \"tick-upper\"] as [string, string, string]] : []),\n ...(input.range ? [[\"--range\", input.range, \"range\"] as [string, string, string]] : []),\n ]);\n const baseFarm = `defi ${chainFlag}lp farm ` + buildCmd([\n [\"--protocol\", slug, \"slug\"],\n [\"--token-a\", input.tokenA, \"token-a\"],\n [\"--token-b\", input.tokenB, \"token-b\"],\n [\"--amount-a\", input.amountA, \"amount-a\"],\n [\"--amount-b\", input.amountB, \"amount-b\"],\n ...(input.pool ? [[\"--pool\", input.pool, \"pool\"] as [string, string, string]] : []),\n ]);\n const claimWithTokenId = (extra = \"\") => `defi ${chainFlag}lp claim ` + buildCmd([\n [\"--protocol\", slug, \"slug\"],\n [\"--token-id\", input.tokenId, \"token-id-from-mint-result\"],\n ...(input.pool ? [[\"--pool\", input.pool, \"pool\"] as [string, string, string]] : []),\n ...(input.gauge ? [[\"--gauge\", input.gauge, \"gauge\"] as [string, string, string]] : []),\n ]) + extra;\n const claimWithGauge = () => `defi ${chainFlag}lp claim ` + buildCmd([\n [\"--protocol\", slug, \"slug\"],\n [\"--gauge\", input.gauge, \"gauge-from-voter.gaugeForPool\"],\n ]);\n\n switch (p.reward_strategy) {\n case \"lp_fee_only\":\n return [\n { step: \"mint\", function: \"NPM.mint(MintParams)\", cli_command: baseAdd },\n { step: \"collect\", function: \"NPM.collect(tokenId, recipient)\", note: \"No emissions; collects accrued LP trading fees only\", cli_command: claimWithTokenId() },\n ];\n case \"on_chain_farming_center\":\n return [\n { step: \"mint\", function: \"NPM.mint(MintParams)\", cli_command: baseAdd },\n { step: \"stake\", function: \"farmingCenter.enterFarming(incentiveKey, tokenId)\", cli_command: baseFarm, note: \"lp farm chains mint+stake into one tx sequence\" },\n { step: \"claim\", function: \"farmingCenter.collectRewards(incentiveKey, tokenId)\", cli_command: claimWithTokenId() },\n ];\n case \"on_chain_gauge_tokenid\":\n return [\n { step: \"mint\", function: \"NPM.mint(MintParams)\", cli_command: baseAdd },\n { step: \"stake\", function: \"gauge.deposit(tokenId)\", cli_command: baseFarm, note: \"lp farm chains mint+stake into one tx sequence\" },\n { step: \"claim\", function: \"gauge.earned(tokenId) → gauge.getReward(tokenId)\", cli_command: claimWithTokenId() },\n ];\n case \"on_chain_gauge\":\n return [\n { step: \"mint\", function: \"Router.addLiquidity / NPM.mint\", cli_command: baseAdd },\n { step: \"stake\", function: \"gauge.deposit(amount)\", cli_command: baseFarm },\n { step: \"claim\", function: \"gauge.earned(token, account) → gauge.getReward(account, tokens[])\", cli_command: claimWithGauge() },\n ];\n case \"auto_stake\":\n return [\n { step: \"mint\", function: \"Router.addLiquidity / NPM.mint\", note: \"LP automatically receives x(3,3) emissions — no separate stake step\", cli_command: baseAdd },\n { step: \"claim\", function: \"gauge.getReward(account, tokens[])\", note: \"Multi-token reward (xRAM + WHYPE on Ramses HL)\", cli_command: claimWithGauge() },\n ];\n case \"on_chain_masterchef\":\n return [\n { step: \"mint\", function: \"NPM.mint or pool.mint\", cli_command: baseAdd },\n { step: \"stake\", function: \"MasterChef.deposit(pid, amount)\", cli_command: baseFarm },\n { step: \"claim\", function: \"MasterChef.harvest(pid) or pendingCake(pid, user)\", cli_command: claimWithTokenId() },\n ];\n case \"off_chain_api\":\n return [\n { step: \"mint\", function: \"NPM.mint(MintParams)\", cli_command: baseAdd },\n { step: \"claim\", function: \"GET claim-data → voter.aggregateClaim(...)\", note: \"Read-only: backend-signed ticket only; broadcast ABI unresolved (selector 0xd6d7a454, 11 args, public registries miss). Use the printed `ticket` payload to submit through the Nest UI.\", cli_command: `defi ${chainFlag}lp claim --protocol ${slug} --address <wallet>` },\n ];\n case \"none\":\n return [{ step: \"mint\", function: \"Router/NPM mint\", note: \"No reward path declared\", cli_command: baseAdd }];\n default:\n return [{ step: \"mint\", function: \"Router/NPM mint\", note: \"reward_strategy unset — pipeline cannot be inferred\", cli_command: baseAdd }];\n }\n}\n\n/** Resolve a pool: \"TOKEN_A/TOKEN_B\" name → address from registry, or raw 0x address */\nfunction resolvePoolAddress(registry: ReturnType<typeof Registry.loadEmbedded>, protocolSlug: string, pool: string): Address {\n if (pool.startsWith(\"0x\")) return pool as Address;\n return registry.resolvePool(protocolSlug, pool).address;\n}\n\n// ── Gauge APR enrichment ──\n\ntype V3PositionInfo = {\n token0: Address;\n token1: Address;\n tickLower: number;\n tickUpper: number;\n liquidity: bigint;\n};\n\n/**\n * Probe a V3-style NPM.positions(tokenId) and return normalized position info.\n * Tries the Ramses-CL non-standard layout (no nonce/operator) first, then the\n * standard Uniswap-V3 layout. Returns null if both decode attempts fail.\n */\nasync function detectV3Liquidity(\n client: ReturnType<typeof createPublicClient>,\n npm: Address,\n tokenId: bigint,\n): Promise<V3PositionInfo | null> {\n const ramsesAbi = parseAbi([\n \"function positions(uint256) view returns (address t0, address t1, int24 ts, int24 tl, int24 tu, uint128 liq, uint256 a, uint256 b, uint128 o0, uint128 o1)\",\n ]);\n const standardAbi = parseAbi([\n \"function positions(uint256) view returns (uint96 nonce, address op, address t0, address t1, uint24 fee, int24 tl, int24 tu, uint128 liq, uint256 a, uint256 b, uint128 o0, uint128 o1)\",\n ]);\n try {\n const r = await client.readContract({ address: npm, abi: ramsesAbi, functionName: \"positions\", args: [tokenId] }) as readonly [Address, Address, number, number, number, bigint, bigint, bigint, bigint, bigint];\n if (r[5] !== undefined) {\n return { token0: r[0], token1: r[1], tickLower: r[3], tickUpper: r[4], liquidity: r[5] };\n }\n } catch { /* try standard */ }\n try {\n const r = await client.readContract({ address: npm, abi: standardAbi, functionName: \"positions\", args: [tokenId] }) as readonly [bigint, Address, Address, Address, number, number, number, bigint, bigint, bigint, bigint, bigint];\n return { token0: r[2], token1: r[3], tickLower: r[5], tickUpper: r[6], liquidity: r[7] };\n } catch {\n return null;\n }\n}\n\nconst V2_PAIR_ABI = parseAbi([\n \"function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast)\",\n \"function totalSupply() external view returns (uint256)\",\n]);\nconst ERC20_DECIMALS_ABI = parseAbi([\"function decimals() external view returns (uint8)\"]);\n\ninterface DiscoveredPool {\n protocol: string;\n pool: string;\n pair?: string;\n type: \"FEE\" | \"EMISSION\";\n source: \"gauge\" | \"farming\" | \"lb_hooks\" | \"fee\" | \"masterchef\" | \"curve_factory\";\n apr?: string;\n total_reward?: string;\n bonus_reward?: string;\n active?: boolean;\n stopped?: boolean;\n moePerDay?: number;\n aprPercent?: number;\n rangeTvlUsd?: number;\n poolTvlUsd?: number;\n isTopPool?: boolean;\n rewardedBins?: number;\n minBinId?: number;\n maxBinId?: number;\n totalMoePerDay?: number;\n moePriceUsd?: number;\n rewardRate?: string;\n totalStaked?: string;\n rewardToken?: string;\n rewardPerDay?: number;\n rewardTokenSymbol?: string;\n}\n\n/**\n * Enrich gauge pools with APR by querying on-chain prices.\n * Only processes pools with rewardRate > 0.\n */\nasync function _enrichGaugeAprs(\n pools: DiscoveredPool[],\n rpcUrl: string,\n registry: ReturnType<typeof Registry.loadEmbedded>,\n chainName: string,\n): Promise<void> {\n const active = pools.filter(p => p.source === \"gauge\" && p.rewardRate && BigInt(p.rewardRate) > 0n);\n if (active.length === 0) return;\n\n // Use chain's wrapped native token instead of hardcoded WHYPE\n const chain = registry.getChain(chainName);\n const WRAPPED_NATIVE = (chain.wrapped_native ?? \"0x0000000000000000000000000000000000000000\") as Address;\n\n try {\n // Step 1: Get wrapped native token price via lending oracle\n let nativePriceUsd = 0;\n try {\n const protos = registry.getProtocolsForChain(chainName).filter(p => p.category === ProtocolCategory.Lending && p.interface === \"aave_v3\");\n if (protos.length > 0) {\n const { createOracleFromLending } = await import(\"@hypurrquant/defi-protocols\");\n const oracle = createOracleFromLending(protos[0]!, chain.effectiveRpcUrl());\n const price = await oracle.getPrice(WRAPPED_NATIVE);\n nativePriceUsd = price.price_f64;\n }\n } catch { /* skip */ }\n\n // Fallback: try stablecoin price (USDC = $1) if no Aave oracle\n if (nativePriceUsd === 0) {\n const tokens = registry.tokens.get(chainName);\n const stablecoin = tokens?.find(t => t.tags?.includes(\"stablecoin\") && (t.symbol === \"USDC\" || t.symbol === \"USDT\"));\n if (stablecoin) {\n // Try to get native price from a native/stablecoin pool in the discovered set\n const nativeStablePool = pools.find(p => {\n const pair = p.pair?.toUpperCase() ?? \"\";\n const nativeSym = chain.native_token?.toUpperCase() ?? \"\";\n const wrappedSym = \"W\" + nativeSym;\n return (pair.includes(nativeSym) || pair.includes(wrappedSym)) && (pair.includes(\"USDC\") || pair.includes(\"USDT\"));\n });\n if (nativeStablePool?.pool) {\n try {\n const [resRaw] = await multicallRead(rpcUrl, [\n [nativeStablePool.pool as Address, encodeFunctionData({ abi: V2_PAIR_ABI, functionName: \"getReserves\" })],\n ]);\n if (resRaw) {\n const _resAbi = parseAbi([\"function f() view returns (uint112, uint112, uint32)\"]);\n const [r0, r1] = decodeFunctionResult({ abi: _resAbi, functionName: \"f\", data: resRaw }) as unknown as [bigint, bigint, bigint];\n const stableDecimals = stablecoin.decimals ?? 6;\n const nativeIsToken0 = WRAPPED_NATIVE.toLowerCase() < stablecoin.address.toLowerCase();\n const reserveNative = Number(nativeIsToken0 ? r0 : r1) / 1e18;\n const reserveStable = Number(nativeIsToken0 ? r1 : r0) / (10 ** stableDecimals);\n if (reserveNative > 0) nativePriceUsd = reserveStable / reserveNative;\n }\n } catch { /* skip */ }\n }\n }\n }\n\n if (nativePriceUsd === 0) return;\n\n // Step 2: For each active gauge pool, compute APR\n for (const p of active) {\n const rewardRate = BigInt(p.rewardRate!);\n const totalStaked = BigInt(p.totalStaked || \"0\");\n const rewardPerDay = Number(rewardRate * 86400n) / 1e18;\n p.rewardPerDay = rewardPerDay;\n\n if (totalStaked === 0n || rewardPerDay === 0) continue;\n\n // Get reward token price\n // For now: assume reward tokens trade against WHYPE\n // NEST, HYBR, xRAM all have WHYPE pairs\n let rewardTokenPriceUsd = 0;\n const rewardToken = p.rewardToken as Address | undefined;\n\n if (rewardToken) {\n if (rewardToken.toLowerCase() === WRAPPED_NATIVE.toLowerCase()) {\n rewardTokenPriceUsd = nativePriceUsd;\n } else {\n // Find the reward token's pool paired with WHYPE\n // Use the pool from this gauge itself if it contains the reward token + WHYPE\n // Otherwise search all discovered pools\n const pair = p.pair ?? \"\";\n const nativeSym = chain.native_token ?? \"ETH\";\n const isRewardWhypePair = pair.toUpperCase().includes(\"W\" + nativeSym.toUpperCase()) || pair.toUpperCase().includes(nativeSym.toUpperCase());\n const tokenPoolAddr = isRewardWhypePair ? p.pool : pools.find(q =>\n q.source === \"gauge\" && q.pool.startsWith(\"0x\") && q.pair &&\n (q.pair.toUpperCase().includes(\"W\" + nativeSym.toUpperCase()) || q.pair.toUpperCase().includes(nativeSym.toUpperCase())) && q.rewardToken?.toLowerCase() === rewardToken.toLowerCase()\n )?.pool;\n\n if (tokenPoolAddr) {\n try {\n const [resRaw] = await multicallRead(rpcUrl, [\n [tokenPoolAddr as Address, encodeFunctionData({ abi: V2_PAIR_ABI, functionName: \"getReserves\" })],\n ]);\n if (resRaw) {\n const _resAbi = parseAbi([\"function f() view returns (uint112, uint112, uint32)\"]);\n const [r0, r1] = decodeFunctionResult({ abi: _resAbi, functionName: \"f\", data: resRaw }) as unknown as [bigint, bigint, bigint];\n const rewardIsToken0 = rewardToken.toLowerCase() < WRAPPED_NATIVE.toLowerCase();\n const reserveReward = Number(rewardIsToken0 ? r0 : r1) / 1e18;\n const reserveWhype = Number(rewardIsToken0 ? r1 : r0) / 1e18;\n if (reserveReward > 0) {\n rewardTokenPriceUsd = (reserveWhype / reserveReward) * nativePriceUsd;\n }\n }\n } catch { /* skip - might be CL pool */ }\n }\n\n // Fallback: try oracle for reward token price\n if (rewardTokenPriceUsd === 0) {\n try {\n const protos = registry.getProtocolsForChain(chainName).filter(pr => pr.category === ProtocolCategory.Lending);\n if (protos.length > 0) {\n const { createOracleFromLending } = await import(\"@hypurrquant/defi-protocols\");\n const chain = registry.getChain(chainName);\n const oracle = createOracleFromLending(protos[0]!, chain.effectiveRpcUrl());\n const price = await oracle.getPrice(rewardToken);\n rewardTokenPriceUsd = price.price_f64;\n }\n } catch { /* no oracle price */ }\n }\n }\n\n // Find symbol for reward token\n const tokens = registry.tokens.get(chainName);\n const tokenInfo = tokens?.find(t => t.address.toLowerCase() === rewardToken.toLowerCase());\n if (tokenInfo) p.rewardTokenSymbol = tokenInfo.symbol;\n }\n\n if (rewardTokenPriceUsd === 0) continue;\n\n // Get LP token value: query pool reserves + totalSupply\n try {\n const [resRaw, tsRaw] = await multicallRead(rpcUrl, [\n [p.pool as Address, encodeFunctionData({ abi: V2_PAIR_ABI, functionName: \"getReserves\" })],\n [p.pool as Address, encodeFunctionData({ abi: V2_PAIR_ABI, functionName: \"totalSupply\" })],\n ]);\n\n if (resRaw && tsRaw) {\n const _resAbi = parseAbi([\"function f() view returns (uint112, uint112, uint32)\"]);\n const [r0, r1] = decodeFunctionResult({ abi: _resAbi, functionName: \"f\", data: resRaw }) as unknown as [bigint, bigint, bigint];\n const totalSupply = decodeU256(tsRaw);\n\n // Simplified: assume both tokens are 18 decimals for V2 pairs\n // TVL = 2 × reserve_whype_side × whype_price (since V2 pools are 50/50)\n const pair = p.pair ?? \"\";\n const tokens = pair.split(\"/\");\n\n // Figure out which side is WHYPE (or valued token)\n let poolTvlUsd = 0;\n const r0F = Number(r0) / 1e18;\n const r1F = Number(r1) / 1e18;\n\n // If one side is WHYPE, double it for total TVL\n if (tokens[0] === \"WHYPE\" || tokens[0] === \"HYPE\") {\n poolTvlUsd = r0F * nativePriceUsd * 2;\n } else if (tokens[1] === \"WHYPE\" || tokens[1] === \"HYPE\") {\n poolTvlUsd = r1F * nativePriceUsd * 2;\n } else {\n // Try both reserves with known prices\n poolTvlUsd = r0F * rewardTokenPriceUsd + r1F * nativePriceUsd;\n }\n\n p.poolTvlUsd = poolTvlUsd;\n\n // Staked ratio\n const stakedRatio = totalSupply > 0n ? Number(totalStaked) / Number(totalSupply) : 0;\n const stakedTvlUsd = poolTvlUsd * stakedRatio;\n\n // APR = (rewardPerDay × rewardPrice × 365) / stakedTvlUsd × 100\n if (stakedTvlUsd > 10) { // minimum $10 staked to avoid division-by-dust\n p.aprPercent = (rewardPerDay * rewardTokenPriceUsd * 365 / stakedTvlUsd) * 100;\n }\n }\n } catch { /* skip pool with no V2 reserves (CL pool) */ }\n }\n } catch { /* APR enrichment failed, pools still have basic data */ }\n}\n\nexport function registerLP(parent: Command, getOpts: () => OutputMode, makeExecutor: () => Executor): void {\n const lp = parent\n .command(\"lp\")\n .description(\"Unified LP operations: discover, add, farm, claim, remove, positions\")\n .option(\"--wallet <name>\", \"OWS wallet name (alternative to DEFI_WALLET_ADDRESS)\");\n\n // ─────────────────────────────────────────\n // lp discover\n // ─────────────────────────────────────────\n lp.command(\"discover\")\n .description(\"Scan all protocols for fee + emission pools (gauges, farming, LB rewards)\")\n .option(\"--protocol <protocol>\", \"Filter to a single protocol slug\")\n .option(\"--emission-only\", \"Only show emission (gauge/farming) pools, skip fee-only\")\n .action(async (opts) => {\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const rpcUrl = chain.effectiveRpcUrl();\n\n // Determine which protocols to scan\n const allProtocols = registry.getProtocolsForChain(chainName);\n const protocols = opts.protocol\n ? [registry.getProtocol(opts.protocol)]\n : allProtocols;\n\n const results: DiscoveredPool[] = [];\n\n await Promise.allSettled(\n protocols.map(async (protocol) => {\n try {\n // Gauge-based protocols (solidly_v2, solidly_cl, algebra_v3, hybra, uniswap_v3 with voter)\n const isGaugeProtocol = [\"solidly_v2\", \"solidly_cl\", \"algebra_v3\", \"hybra\"].includes(protocol.interface) ||\n (protocol.interface === \"uniswap_v3\" && protocol.contracts?.[\"voter\"]);\n if (isGaugeProtocol) {\n const chainTokens = registry.tokens.get(chainName)?.map(t => t.address);\n const adapter = createGauge(protocol, rpcUrl, chainTokens);\n if (adapter.discoverGaugedPools) {\n const pools = await adapter.discoverGaugedPools();\n for (const p of pools) {\n results.push({\n protocol: protocol.slug,\n pool: p.pool,\n pair: `${p.token0}/${p.token1}`,\n type: \"EMISSION\",\n source: \"gauge\",\n rewardRate: p.rewardRate ? p.rewardRate.toString() : undefined,\n totalStaked: p.totalStaked ? p.totalStaked.toString() : undefined,\n rewardToken: p.rewardToken,\n });\n }\n }\n }\n\n // KittenSwap Algebra eternal farming\n if (protocol.interface === \"algebra_v3\" && protocol.contracts?.[\"farming_center\"]) {\n const adapter = createKittenSwapFarming(protocol, rpcUrl);\n const pools = await adapter.discoverFarmingPools();\n for (const p of pools) {\n results.push({\n protocol: protocol.slug,\n pool: p.pool,\n type: \"EMISSION\",\n source: \"farming\",\n total_reward: p.totalReward.toString(),\n bonus_reward: p.bonusReward.toString(),\n active: p.active,\n });\n }\n }\n\n // Merchant Moe LB hooks\n if (protocol.interface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n const adapter = createMerchantMoeLB(protocol, rpcUrl);\n const pools = await adapter.discoverRewardedPools();\n for (const p of pools) {\n if (!opts.emissionOnly || !p.stopped) {\n results.push({\n protocol: protocol.slug,\n pool: p.pool,\n pair: `${p.symbolX}/${p.symbolY}`,\n type: \"EMISSION\",\n source: \"lb_hooks\",\n stopped: p.stopped,\n moePerDay: p.moePerDay,\n aprPercent: p.aprPercent,\n rangeTvlUsd: p.rangeTvlUsd,\n poolTvlUsd: p.poolTvlUsd,\n isTopPool: p.isTopPool,\n rewardedBins: p.rewardedBins,\n minBinId: p.minBinId,\n maxBinId: p.maxBinId,\n totalMoePerDay: p.totalMoePerDay,\n moePriceUsd: p.moePriceUsd,\n });\n }\n }\n }\n // PancakeSwap V3 MasterChef emissions\n if (protocol.interface === \"uniswap_v3\" && protocol.contracts?.[\"masterchef\"]) {\n const mcAddr = protocol.contracts[\"masterchef\"] as Address;\n const mcAbi = parseAbi([\n \"function poolLength() view returns (uint256)\",\n \"function poolInfo(uint256) view returns (uint256 allocPoint, address v3Pool, address token0, address token1, uint24 fee, uint256 totalLiquidity, uint256 totalBoostLiquidity)\",\n \"function totalAllocPoint() view returns (uint256)\",\n \"function latestPeriodCakePerSecond() view returns (uint256)\",\n \"function CAKE() view returns (address)\",\n ]);\n const mcClient = createPublicClient({ transport: http(rpcUrl) });\n try {\n const [poolLen, totalAlloc, cakePerSec, cakeAddr] = await Promise.all([\n mcClient.readContract({ address: mcAddr, abi: mcAbi, functionName: \"poolLength\" }) as Promise<bigint>,\n mcClient.readContract({ address: mcAddr, abi: mcAbi, functionName: \"totalAllocPoint\" }) as Promise<bigint>,\n mcClient.readContract({ address: mcAddr, abi: mcAbi, functionName: \"latestPeriodCakePerSecond\" }) as Promise<bigint>,\n mcClient.readContract({ address: mcAddr, abi: mcAbi, functionName: \"CAKE\" }) as Promise<Address>,\n ]);\n // Scan top pools (limit to 100 with highest allocPoint)\n const MAX_MC_SCAN = Math.min(Number(poolLen), 100);\n const poolInfoCalls: Array<[Address, Hex]> = [];\n for (let i = 0; i < MAX_MC_SCAN; i++) {\n poolInfoCalls.push([mcAddr, encodeFunctionData({ abi: mcAbi, functionName: \"poolInfo\", args: [BigInt(i)] })]);\n }\n const poolInfoResults = await multicallRead(rpcUrl, poolInfoCalls);\n // Get CAKE price via oracle\n let cakePriceUsd = 0;\n try {\n const lendingProtos = registry.getProtocolsForChain(chainName).filter(lp => lp.category === ProtocolCategory.Lending && lp.interface === \"aave_v3\");\n if (lendingProtos.length > 0) {\n const { createOracleFromLending } = await import(\"@hypurrquant/defi-protocols\");\n const oracleInst = createOracleFromLending(lendingProtos[0]!, rpcUrl);\n const price = await oracleInst.getPrice(cakeAddr);\n cakePriceUsd = price.price_f64;\n }\n } catch { /* skip */ }\n\n for (let i = 0; i < poolInfoResults.length; i++) {\n const raw = poolInfoResults[i];\n if (!raw || raw.length < 66) continue;\n try {\n const decoded = decodeFunctionResult({ abi: mcAbi, functionName: \"poolInfo\", data: raw }) as unknown as [bigint, Address, Address, Address, number, bigint, bigint];\n const [allocPoint, v3Pool, t0, t1, , totalLiq] = decoded;\n if (allocPoint === 0n || v3Pool === zeroAddress) continue;\n const tokens = registry.tokens.get(chainName);\n const sym0 = tokens?.find(t => t.address.toLowerCase() === t0?.toLowerCase())?.symbol ?? t0?.slice(0, 8) ?? \"?\";\n const sym1 = tokens?.find(t => t.address.toLowerCase() === t1?.toLowerCase())?.symbol ?? t1?.slice(0, 8) ?? \"?\";\n // Compute APR: (allocPoint/totalAlloc) * cakePerSec * 86400 * 365 * cakePrice / poolTvl\n const cakePerDay = totalAlloc > 0n ? Number(cakePerSec * BigInt(allocPoint) * 86400n / totalAlloc) / 1e18 : 0;\n results.push({\n protocol: protocol.slug,\n pool: v3Pool,\n pair: `${sym0}/${sym1}`,\n type: \"EMISSION\",\n source: \"masterchef\",\n rewardRate: totalAlloc > 0n ? String(cakePerSec * BigInt(allocPoint) / totalAlloc) : \"0\",\n totalStaked: String(totalLiq),\n rewardToken: cakeAddr,\n rewardTokenSymbol: \"CAKE\",\n rewardPerDay: cakePerDay,\n } as DiscoveredPool);\n } catch { /* skip malformed pool */ }\n }\n } catch { /* masterchef query failed */ }\n }\n\n // Curve StableswapNG: enumerate via factory.pool_count + pool_list\n if (protocol.interface === \"curve_stableswap\" && protocol.contracts?.[\"stableswap_factory\"]) {\n const factory = protocol.contracts[\"stableswap_factory\"] as Address;\n const factoryAbi = parseAbi([\n \"function pool_count() view returns (uint256)\",\n \"function pool_list(uint256) view returns (address)\",\n ]);\n const poolAbi = parseAbi([\n \"function coins(uint256) view returns (address)\",\n \"function name() view returns (string)\",\n ]);\n const cClient = createPublicClient({ transport: http(rpcUrl) });\n try {\n const count = await cClient.readContract({ address: factory, abi: factoryAbi, functionName: \"pool_count\" }) as bigint;\n const MAX_SCAN = Math.min(Number(count), 50);\n for (let i = 0; i < MAX_SCAN; i++) {\n try {\n const pool = await cClient.readContract({ address: factory, abi: factoryAbi, functionName: \"pool_list\", args: [BigInt(i)] }) as Address;\n const [c0, c1, name] = await Promise.all([\n cClient.readContract({ address: pool, abi: poolAbi, functionName: \"coins\", args: [0n] }).catch(() => null) as Promise<Address | null>,\n cClient.readContract({ address: pool, abi: poolAbi, functionName: \"coins\", args: [1n] }).catch(() => null) as Promise<Address | null>,\n cClient.readContract({ address: pool, abi: poolAbi, functionName: \"name\" }).catch(() => \"\") as Promise<string>,\n ]);\n results.push({\n protocol: protocol.slug,\n pool,\n pair: name || `${c0 ?? \"?\"}/${c1 ?? \"?\"}`,\n type: \"FEE\",\n source: \"curve_factory\",\n } as DiscoveredPool);\n } catch { /* skip malformed pool */ }\n }\n } catch { /* factory query failed */ }\n }\n\n } catch {\n // Skip protocols that fail discovery (no adapter, missing contracts, etc.)\n }\n }),\n );\n\n // Compute APR for gauge pools with active rewardRate\n await _enrichGaugeAprs(results, rpcUrl, registry, chainName);\n\n // Sort by APR descending (puts top-yield pools first; pools with no APR sink to bottom)\n results.sort((a, b) => (b.aprPercent ?? 0) - (a.aprPercent ?? 0));\n if (opts.emissionOnly) {\n // Filter to pools that are actually distributing rewards right now (moePerDay > 0 OR rewardRate > 0)\n printOutput(\n results.filter((r) =>\n r.type === \"EMISSION\" &&\n ((r.moePerDay ?? 0) > 0 || (r.rewardRate && BigInt(r.rewardRate) > 0n)),\n ),\n getOpts(),\n );\n } else {\n printOutput(results, getOpts());\n }\n });\n\n // ─────────────────────────────────────────\n // lp add\n // ─────────────────────────────────────────\n lp.command(\"add\")\n .description(\"Add liquidity to a pool\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--token-a <token>\", \"First token symbol or address\")\n .requiredOption(\"--token-b <token>\", \"Second token symbol or address\")\n .requiredOption(\"--amount-a <amount>\", \"Amount of token A in wei\")\n .requiredOption(\"--amount-b <amount>\", \"Amount of token B in wei\")\n .option(\"--pool <name_or_address>\", \"Pool name (e.g. WHYPE/USDC) or address\")\n .option(\"--recipient <address>\", \"Recipient address\")\n .option(\"--tick-lower <tick>\", \"Lower tick for concentrated LP (default: full range)\")\n .option(\"--tick-upper <tick>\", \"Upper tick for concentrated LP (default: full range)\")\n .option(\"--range <percent>\", \"±N% concentrated range around current price (e.g. --range 2)\")\n .option(\"--num-bins <n>\", \"Merchant Moe LB: bins on each side of active (default 5)\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const protocol = registry.getProtocol(opts.protocol);\n const tokenA = opts.tokenA.startsWith(\"0x\")\n ? (opts.tokenA as Address)\n : registry.resolveToken(chainName, opts.tokenA).address as Address;\n const tokenB = opts.tokenB.startsWith(\"0x\")\n ? (opts.tokenB as Address)\n : registry.resolveToken(chainName, opts.tokenB).address as Address;\n const recipient = (opts.recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const poolAddr = opts.pool ? resolvePoolAddress(registry, opts.protocol, opts.pool) : undefined;\n\n // Merchant Moe LB add: distinct path from V2 — uses LBRouter.addLiquidity with bin distribution\n if (protocol.interface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n if (!poolAddr) throw new Error(\"--pool is required for Merchant Moe LB add\");\n const lbAdapter = createMerchantMoeLB(protocol, chain.effectiveRpcUrl());\n const [tokenX, tokenY, amountX, amountY] = tokenA.toLowerCase() < tokenB.toLowerCase()\n ? [tokenA, tokenB, BigInt(opts.amountA), BigInt(opts.amountB)]\n : [tokenB, tokenA, BigInt(opts.amountB), BigInt(opts.amountA)];\n const client = createPublicClient({ transport: http(chain.effectiveRpcUrl()) });\n const binStep = await client.readContract({\n address: poolAddr, abi: parseAbi([\"function getBinStep() view returns (uint16)\"]), functionName: \"getBinStep\",\n }) as number;\n const tx = await lbAdapter.buildAddLiquidity({\n pool: poolAddr,\n tokenX, tokenY, binStep,\n amountX, amountY,\n recipient,\n numBins: opts.numBins !== undefined ? parseInt(opts.numBins, 10) : 5,\n });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n return;\n }\n\n const adapter = createDex(protocol, chain.effectiveRpcUrl());\n const tx = await adapter.buildAddLiquidity({\n protocol: protocol.name,\n token_a: tokenA,\n token_b: tokenB,\n amount_a: BigInt(opts.amountA),\n amount_b: BigInt(opts.amountB),\n recipient,\n tick_lower: opts.tickLower !== undefined ? parseInt(opts.tickLower) : undefined,\n tick_upper: opts.tickUpper !== undefined ? parseInt(opts.tickUpper) : undefined,\n range_pct: opts.range !== undefined ? parseFloat(opts.range) : undefined,\n pool: poolAddr,\n });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n\n // ─────────────────────────────────────────\n // lp farm (add liquidity + auto-stake)\n // ─────────────────────────────────────────\n lp.command(\"farm\")\n .description(\"Add liquidity and auto-stake into gauge/farming for emissions\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--token-a <token>\", \"First token symbol or address\")\n .requiredOption(\"--token-b <token>\", \"Second token symbol or address\")\n .requiredOption(\"--amount-a <amount>\", \"Amount of token A in wei\")\n .requiredOption(\"--amount-b <amount>\", \"Amount of token B in wei\")\n .option(\"--pool <name_or_address>\", \"Pool name (e.g. WHYPE/USDC) or address\")\n .option(\"--gauge <address>\", \"Gauge address (required for solidly/hybra if not resolved automatically)\")\n .option(\"--recipient <address>\", \"Recipient / owner address\")\n .option(\"--tick-lower <tick>\", \"Lower tick for concentrated LP\")\n .option(\"--tick-upper <tick>\", \"Upper tick for concentrated LP\")\n .option(\"--range <percent>\", \"±N% concentrated range around current price\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const protocol = registry.getProtocol(opts.protocol);\n const rpcUrl = chain.effectiveRpcUrl();\n const recipient = (opts.recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const poolAddr = opts.pool ? resolvePoolAddress(registry, opts.protocol, opts.pool) : undefined;\n\n const tokenA = opts.tokenA.startsWith(\"0x\")\n ? (opts.tokenA as Address)\n : registry.resolveToken(chainName, opts.tokenA).address as Address;\n const tokenB = opts.tokenB.startsWith(\"0x\")\n ? (opts.tokenB as Address)\n : registry.resolveToken(chainName, opts.tokenB).address as Address;\n\n // Step 1: Add liquidity\n const dexAdapter = createDex(protocol, rpcUrl);\n const addTx = await dexAdapter.buildAddLiquidity({\n protocol: protocol.name,\n token_a: tokenA,\n token_b: tokenB,\n amount_a: BigInt(opts.amountA),\n amount_b: BigInt(opts.amountB),\n recipient,\n tick_lower: opts.tickLower !== undefined ? parseInt(opts.tickLower) : undefined,\n tick_upper: opts.tickUpper !== undefined ? parseInt(opts.tickUpper) : undefined,\n range_pct: opts.range !== undefined ? parseFloat(opts.range) : undefined,\n pool: poolAddr,\n });\n\n process.stderr.write(\"Step 1/2: Adding liquidity...\\n\");\n const addResult = await executor.execute(addTx);\n printOutput({ step: \"lp_add\", ...addResult }, getOpts());\n\n if (addResult.status !== \"confirmed\" && addResult.status !== \"simulated\") {\n process.stderr.write(\"Step 2/2: Skipped — LP add did not succeed.\\n\");\n return;\n }\n\n // Extract minted tokenId from result (broadcast mode populates minted_token_id)\n const mintedTokenId = addResult.details?.minted_token_id\n ? BigInt(addResult.details.minted_token_id as string)\n : undefined;\n\n // Step 2: Auto-stake based on protocol interface\n const iface = protocol.interface;\n\n // KittenSwap Algebra eternal farming\n if (iface === \"algebra_v3\" && protocol.contracts?.[\"farming_center\"]) {\n if (!mintedTokenId) {\n process.stderr.write(\"Step 2/2: Skipped staking (no tokenId — run in --broadcast mode to get minted NFT)\\n\");\n return;\n }\n if (!poolAddr) throw new Error(\"--pool is required for lp farm with KittenSwap (needed for farming center)\");\n process.stderr.write(\"Step 2/2: Staking into KittenSwap eternal farming...\\n\");\n const farmAdapter = createKittenSwapFarming(protocol, rpcUrl);\n const stakeTx = await farmAdapter.buildEnterFarming(mintedTokenId, poolAddr, recipient);\n const stakeResult = await executor.execute(stakeTx);\n printOutput({ step: \"stake_farming\", ...stakeResult }, getOpts());\n return;\n }\n\n // Solidly V2 / CL / Hybra / uniswap_v3-with-voter (Aerodrome Slipstream) gauge staking\n const isGaugeStakeable = [\"solidly_v2\", \"solidly_cl\", \"hybra\"].includes(iface)\n || (iface === \"uniswap_v3\" && protocol.contracts?.[\"voter\"]);\n if (isGaugeStakeable) {\n if (!mintedTokenId && iface !== \"solidly_v2\") {\n process.stderr.write(\"Step 2/2: Skipped staking (no tokenId — run in --broadcast mode to get minted NFT)\\n\");\n return;\n }\n\n let gaugeAddr = opts.gauge as Address | undefined;\n // Try to resolve gauge from pool address if not provided\n if (!gaugeAddr && poolAddr) {\n try {\n const gaugeAdapter = createGauge(protocol, rpcUrl);\n if (gaugeAdapter.resolveGauge) {\n gaugeAddr = await gaugeAdapter.resolveGauge(poolAddr);\n }\n } catch {\n // ignore\n }\n }\n if (!gaugeAddr) throw new Error(\"--gauge <address> is required for staking (could not auto-resolve gauge)\");\n\n process.stderr.write(\"Step 2/2: Staking into gauge...\\n\");\n const gaugeAdapter = createGauge(protocol, rpcUrl);\n // Hybra uses tokenId-based deposit; solidly_v2 uses amount.\n // Aerodrome V2 (and most Solidly forks) gauge.deposit reverts on uint256.max — query\n // user's actual LP balance and stake that exact amount.\n const tokenIdArg = mintedTokenId;\n let amountArg = 0n;\n if (iface === \"solidly_v2\" && poolAddr) {\n const erc20Abi = parseAbi([\"function balanceOf(address) view returns (uint256)\"]);\n const lpClient = createPublicClient({ transport: http(rpcUrl) });\n amountArg = await lpClient.readContract({\n address: poolAddr, abi: erc20Abi, functionName: \"balanceOf\", args: [recipient],\n }) as bigint;\n if (amountArg === 0n) {\n process.stderr.write(\"Step 2/2: Skipped staking — LP balance 0 (Step 1 add returned no LP).\\n\");\n return;\n }\n }\n // For solidly_v2, the LP token is the pool itself — pass poolAddr so approve is generated\n const lpTokenArg = iface === \"solidly_v2\" ? poolAddr : undefined;\n const stakeTx = await gaugeAdapter.buildDeposit(gaugeAddr, amountArg, tokenIdArg, lpTokenArg);\n const stakeResult = await executor.execute(stakeTx);\n printOutput({ step: \"stake_gauge\", ...stakeResult }, getOpts());\n return;\n }\n\n // Merchant Moe LB: no explicit staking needed (hooks auto-handle rewards)\n if (iface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n process.stderr.write(\"Step 2/2: Merchant Moe LB hooks handle rewards automatically — no staking needed.\\n\");\n return;\n }\n\n process.stderr.write(\"Step 2/2: No staking adapter found for this protocol interface — liquidity added only.\\n\");\n });\n\n // ─────────────────────────────────────────\n // lp claim\n // ─────────────────────────────────────────\n lp.command(\"claim\")\n .description(\"Claim rewards from a pool (fee or emission)\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .option(\"--pool <address>\", \"Pool address (required for farming/LB)\")\n .option(\"--gauge <address>\", \"Gauge contract address (required for solidly/hybra)\")\n .option(\"--token-id <id>\", \"NFT tokenId (for CL gauge or farming positions)\")\n .option(\"--bins <binIds>\", \"Comma-separated bin IDs (for Merchant Moe LB)\")\n .option(\"--address <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .option(\"--redeem-type <n>\", \"Hybra: 0=instant exit (with penalty), 1=lock into 2-year veHYBR (default)\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const rpcUrl = chain.effectiveRpcUrl();\n const protocol = registry.getProtocol(opts.protocol);\n const account = resolveAccount(opts.address, lp.opts<{ wallet?: string }>().wallet);\n const iface = protocol.interface;\n\n // V3 NPM.collect — used either when the whole protocol is fee-only\n // (e.g. swap-only V3 forks) OR when an auto_stake protocol's specific\n // pool has no gauge (caller passes --token-id without --gauge).\n const isV3Fee =\n protocol.reward_strategy === \"lp_fee_only\" ||\n (iface === \"uniswap_v3\" && opts.tokenId && !opts.gauge);\n if (isV3Fee) {\n if (!opts.tokenId) throw new Error(\"--token-id is required for V3 LP fee collection\");\n const adapter = createDex(protocol, rpcUrl);\n if (!(\"buildCollectFees\" in adapter) || typeof (adapter as { buildCollectFees?: unknown }).buildCollectFees !== \"function\") {\n throw new Error(`[${protocol.name}] adapter does not support buildCollectFees`);\n }\n const tx = await (adapter as { buildCollectFees: (tokenId: bigint, recipient: Address) => Promise<unknown> })\n .buildCollectFees(BigInt(opts.tokenId), account);\n const result = await executor.execute(tx as Parameters<typeof executor.execute>[0]);\n printOutput(result, getOpts());\n return;\n }\n\n // Off-chain claim (Nest): emissions read from blaze.nest.aegas.it / usenest.xyz.\n // The backend issues a signed claim ticket; we reproduce the byte-level\n // calldata pattern observed in successful onchain claims (template derived\n // from diffing two confirmed claim txs — only the ticket struct slots\n // differ between callers).\n if (protocol.reward_strategy === \"off_chain_api\") {\n const nest = createNestOffChain(protocol);\n const status = await nest.getClaimStatus(account);\n const ticket = await nest.getClaimTicket(account);\n if (!ticket) {\n printOutput({\n protocol: protocol.slug,\n wallet: account,\n voter: nest.getVoterAddress(),\n reward_symbol: \"NEST\",\n pending_amount: 0,\n note: \"No claim ticket available — backend reports no points to claim.\",\n }, getOpts());\n return;\n }\n const tx = await nest.buildClaim(account);\n\n // Pre-flight simulation gate: verify the voter accepts the calldata under\n // `from: account` before paying gas. Catches expired tickets, signature\n // mismatches, replay rejections, etc. without burning a tx.\n const preflightClient = createPublicClient({ transport: http(rpcUrl) });\n try {\n await preflightClient.call({\n account,\n to: tx.to as Address,\n data: tx.data as Hex,\n value: tx.value,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n printOutput({\n protocol: protocol.slug,\n wallet: account,\n voter: nest.getVoterAddress(),\n reward_symbol: \"NEST\",\n pending_amount: status.pendingFormatted,\n pending_raw: status.pendingRaw.toString(),\n ticket: {\n amount: ticket.amount.toString(),\n timestamp: ticket.timestamp.toString(),\n day: ticket.day === null ? null : ticket.day.toString(),\n signature: ticket.signature,\n },\n preflight: \"revert\",\n preflight_error: msg.length > 400 ? msg.slice(0, 400) + \"...\" : msg,\n broadcast: \"skipped\",\n note: \"Simulation reverted — broadcast aborted to avoid wasted gas. Common causes: ticket expired, caller != ticket signer, ticket already claimed.\",\n }, getOpts());\n return;\n }\n\n // Simulation passed → broadcast (or stay in dry-run if executor is configured that way)\n const result = await executor.execute(tx);\n printOutput({\n protocol: protocol.slug,\n wallet: account,\n voter: nest.getVoterAddress(),\n reward_symbol: \"NEST\",\n pending_amount: status.pendingFormatted,\n pending_raw: status.pendingRaw.toString(),\n total_claimed_raw: status.totalClaimedRaw.toString(),\n total_available_raw: status.totalAvailableRaw.toString(),\n ticket: {\n amount: ticket.amount.toString(),\n timestamp: ticket.timestamp.toString(),\n day: ticket.day === null ? null : ticket.day.toString(),\n signature: ticket.signature,\n },\n preflight: \"passed\",\n claim_result: result,\n note: \"Calldata derived from byte-level template (verified against two known-successful onchain claim txs). Pre-flight eth_call simulation passed before broadcast.\",\n }, getOpts());\n return;\n }\n\n // KittenSwap farming: collectRewards (collect + claim in one tx)\n if (iface === \"algebra_v3\" && protocol.contracts?.[\"farming_center\"]) {\n if (!opts.pool) throw new Error(\"--pool is required for KittenSwap farming claim\");\n if (!opts.tokenId) throw new Error(\"--token-id is required for KittenSwap farming claim\");\n const adapter = createKittenSwapFarming(protocol, rpcUrl);\n const tx = await adapter.buildCollectRewards(\n BigInt(opts.tokenId),\n opts.pool as Address,\n account,\n );\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n return;\n }\n\n // Merchant Moe LB claim\n if (iface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n if (!opts.pool) throw new Error(\"--pool is required for Merchant Moe LB claim\");\n const adapter = createMerchantMoeLB(protocol, rpcUrl);\n const binIds = opts.bins\n ? (opts.bins as string).split(\",\").map((s: string) => parseInt(s.trim()))\n : undefined;\n const tx = await adapter.buildClaimRewards(account, opts.pool as Address, binIds);\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n return;\n }\n\n // Solidly / Hybra gauge claim (including uniswap_v3 with voter)\n if ([\"solidly_v2\", \"solidly_cl\", \"algebra_v3\", \"hybra\"].includes(iface) ||\n (iface === \"uniswap_v3\" && protocol.contracts?.[\"voter\"])) {\n if (!opts.gauge) throw new Error(\"--gauge is required for gauge claim\");\n const adapter = createGauge(protocol, rpcUrl);\n type GaugeTx = Awaited<ReturnType<typeof adapter.buildClaimRewards>>;\n let tx: GaugeTx;\n // Ramses CL pattern: x(3,3) auto-stake on uniswap_v3 — claim must go through NPM\n // (gauge.getReward* reverts NOT_AUTHORIZED_CLAIMER for EOAs; only NPM/voter authorized).\n // We call NPM.getPeriodReward(currentEpoch, tokenId, tokens[], receiver).\n if (opts.tokenId &&\n iface === \"uniswap_v3\" &&\n protocol.reward_strategy === \"auto_stake\" &&\n \"buildClaimRewardsViaNPMPeriodReward\" in adapter &&\n typeof (adapter as { buildClaimRewardsViaNPMPeriodReward?: unknown }).buildClaimRewardsViaNPMPeriodReward === \"function\") {\n const npm = protocol.contracts?.[\"position_manager\"] as Address | undefined;\n if (!npm) throw new Error(`${protocol.name} requires contracts.position_manager for NPM-based claim`);\n tx = await (adapter as {\n buildClaimRewardsViaNPMPeriodReward: (\n npm: Address, tokenId: bigint, receiver: Address,\n opts?: { tokens?: Address[]; gauge?: Address; period?: bigint },\n ) => Promise<GaugeTx>;\n }).buildClaimRewardsViaNPMPeriodReward(\n npm,\n BigInt(opts.tokenId),\n account,\n { gauge: opts.gauge as Address },\n );\n } else if (opts.tokenId) {\n if (!adapter.buildClaimRewardsByTokenId) throw new Error(`${protocol.name} does not support NFT-based claim`);\n const claimOpts = opts.redeemType !== undefined\n ? { redeemType: parseInt(opts.redeemType, 10) }\n : undefined;\n tx = await (adapter as { buildClaimRewardsByTokenId: (gauge: Address, tokenId: bigint, opts?: { redeemType?: number }) => Promise<GaugeTx> })\n .buildClaimRewardsByTokenId(opts.gauge as Address, BigInt(opts.tokenId), claimOpts);\n } else {\n tx = await adapter.buildClaimRewards(opts.gauge as Address, account);\n }\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n return;\n }\n\n throw new Error(`No claim method found for protocol interface '${iface}'`);\n });\n\n // ─────────────────────────────────────────\n // lp pipeline (mint→stake→claim plan with optional inputs)\n // ─────────────────────────────────────────\n lp.command(\"pipeline\")\n .description(\"Show the mint→stake→claim sequence implied by a protocol's reward_strategy. Pass --token-a/-b/--amount-a/-b etc. to get fully-resolved CLI commands you can copy-paste.\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .option(\"--pool <pool>\", \"Pool name or address (e.g. WHYPE/USDC)\")\n .option(\"--token-a <token>\", \"First token symbol or address\")\n .option(\"--token-b <token>\", \"Second token symbol or address\")\n .option(\"--amount-a <amount>\", \"Amount of token A in wei\")\n .option(\"--amount-b <amount>\", \"Amount of token B in wei\")\n .option(\"--tick-lower <tick>\", \"Lower tick (V3/CL)\")\n .option(\"--tick-upper <tick>\", \"Upper tick (V3/CL)\")\n .option(\"--range <percent>\", \"±N% concentrated range\")\n .option(\"--token-id <id>\", \"NFT tokenId for already-minted positions (skips mint step)\")\n .option(\"--gauge <addr>\", \"Gauge address for stake/claim\")\n .action((opts) => {\n const registry = Registry.loadEmbedded();\n const protocol = registry.getProtocol(opts.protocol);\n const chainName = parent.opts<{ chain?: string }>().chain;\n const steps = buildPipelineSteps(protocol, {\n chain: chainName,\n pool: opts.pool,\n tokenA: opts.tokenA,\n tokenB: opts.tokenB,\n amountA: opts.amountA,\n amountB: opts.amountB,\n tickLower: opts.tickLower,\n tickUpper: opts.tickUpper,\n range: opts.range,\n tokenId: opts.tokenId,\n gauge: opts.gauge,\n });\n printOutput({\n protocol: protocol.slug,\n chain: protocol.chain,\n interface: protocol.interface,\n is_active: protocol.is_active !== false,\n verified: protocol.verified === true,\n reward_strategy: protocol.reward_strategy ?? \"(unset — falls back to interface inference)\",\n steps,\n note: \"Plan output. Run each cli_command sequentially. After the mint step, broadcast mode prints `details.minted_token_id` — feed that into the next step's --token-id.\",\n }, getOpts());\n });\n\n // ─────────────────────────────────────────\n // lp remove\n // ─────────────────────────────────────────\n lp.command(\"remove\")\n .description(\"Auto-unstake (if staked) and remove liquidity from a pool\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--token-a <token>\", \"First token symbol or address\")\n .requiredOption(\"--token-b <token>\", \"Second token symbol or address\")\n .requiredOption(\"--liquidity <amount>\", \"Liquidity amount to remove in wei\")\n .option(\"--pool <address>\", \"Pool address (needed to resolve gauge)\")\n .option(\"--gauge <address>\", \"Gauge contract address (for solidly/hybra unstake)\")\n .option(\"--token-id <id>\", \"NFT tokenId (for CL gauge or farming positions)\")\n .option(\"--recipient <address>\", \"Recipient address\")\n .option(\"--redeem-type <n>\", \"Hybra: 0=instant exit (with penalty), 1=lock into 2-year veHYBR (default — WARNING: long lock)\")\n .option(\"--bins <binIds>\", \"Merchant Moe LB: comma-separated bin IDs to withdraw\")\n .option(\"--amounts <wei>\", \"Merchant Moe LB: comma-separated bin amounts (parallel to --bins, default: full balance)\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const rpcUrl = chain.effectiveRpcUrl();\n const protocol = registry.getProtocol(opts.protocol);\n const iface = protocol.interface;\n const recipient = (opts.recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n\n // Merchant Moe LB remove: distinct path — uses LBRouter.removeLiquidity with per-bin amounts + ERC1155 approveForAll\n if (iface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n if (!opts.pool) throw new Error(\"--pool is required for Merchant Moe LB remove\");\n if (!opts.bins) throw new Error(\"--bins <id1,id2,...> is required for Merchant Moe LB remove\");\n const lbAdapter = createMerchantMoeLB(protocol, rpcUrl);\n const tokenA = opts.tokenA.startsWith(\"0x\")\n ? (opts.tokenA as Address)\n : registry.resolveToken(chainName, opts.tokenA).address as Address;\n const tokenB = opts.tokenB.startsWith(\"0x\")\n ? (opts.tokenB as Address)\n : registry.resolveToken(chainName, opts.tokenB).address as Address;\n const [tokenX, tokenY] = tokenA.toLowerCase() < tokenB.toLowerCase() ? [tokenA, tokenB] : [tokenB, tokenA];\n const binIds = (opts.bins as string).split(\",\").map((s) => parseInt(s.trim()));\n const client = createPublicClient({ transport: http(rpcUrl) });\n const binStep = await client.readContract({\n address: opts.pool as Address, abi: parseAbi([\"function getBinStep() view returns (uint16)\"]), functionName: \"getBinStep\",\n }) as number;\n let amounts: bigint[];\n if (opts.amounts) {\n amounts = (opts.amounts as string).split(\",\").map((s) => BigInt(s.trim()));\n } else {\n // Default: full balance per bin\n const balanceAbi = parseAbi([\"function balanceOf(address account, uint256 id) view returns (uint256)\"]);\n amounts = await Promise.all(binIds.map((id) =>\n client.readContract({ address: opts.pool as Address, abi: balanceAbi, functionName: \"balanceOf\", args: [recipient, BigInt(id)] }) as Promise<bigint>,\n ));\n }\n // Pre-tx: approveForAll(LBRouter, true) on the LBPair (ERC1155)\n const approveForAllAbi = parseAbi([\"function approveForAll(address operator, bool approved) external\"]);\n const lbRouter = protocol.contracts[\"lb_router\"] as Address;\n const approveTx = {\n description: `[${protocol.name}] approveForAll LBPair → LBRouter`,\n to: opts.pool as Address,\n data: encodeFunctionData({ abi: approveForAllAbi, functionName: \"approveForAll\", args: [lbRouter, true] }),\n value: 0n,\n gas_estimate: 80_000,\n };\n const tx = await lbAdapter.buildRemoveLiquidity({\n tokenX, tokenY, binStep,\n binIds, amounts,\n recipient,\n });\n tx.pre_txs = [approveTx, ...(tx.pre_txs ?? [])];\n const result = await executor.execute(tx);\n printOutput({ step: \"lb_remove\", ...result }, getOpts());\n return;\n }\n\n const tokenA = opts.tokenA.startsWith(\"0x\")\n ? (opts.tokenA as Address)\n : registry.resolveToken(chainName, opts.tokenA).address as Address;\n const tokenB = opts.tokenB.startsWith(\"0x\")\n ? (opts.tokenB as Address)\n : registry.resolveToken(chainName, opts.tokenB).address as Address;\n\n // Step 1: Unstake if applicable\n const poolAddr = opts.pool ? (opts.pool as Address) : undefined;\n let didUnstake = false;\n\n // KittenSwap farming exit\n if (iface === \"algebra_v3\" && protocol.contracts?.[\"farming_center\"] && opts.tokenId && poolAddr) {\n process.stderr.write(\"Step 1/2: Exiting KittenSwap farming...\\n\");\n const farmAdapter = createKittenSwapFarming(protocol, rpcUrl);\n const exitTx = await farmAdapter.buildExitFarming(BigInt(opts.tokenId), poolAddr);\n const exitResult = await executor.execute(exitTx);\n printOutput({ step: \"unstake_farming\", ...exitResult }, getOpts());\n if (exitResult.status !== \"confirmed\" && exitResult.status !== \"simulated\") {\n process.stderr.write(\"Step 2/2: Skipped — unstake did not succeed.\\n\");\n return;\n }\n didUnstake = true;\n }\n // Solidly / Hybra / uniswap_v3-with-voter (Aerodrome Slipstream) gauge withdraw\n else if ([\"solidly_v2\", \"solidly_cl\", \"hybra\"].includes(iface)\n || (iface === \"uniswap_v3\" && protocol.contracts?.[\"voter\"])) {\n let gaugeAddr = opts.gauge as Address | undefined;\n if (!gaugeAddr && poolAddr) {\n try {\n const gaugeAdapter = createGauge(protocol, rpcUrl);\n if (gaugeAdapter.resolveGauge) {\n gaugeAddr = await gaugeAdapter.resolveGauge(poolAddr);\n }\n } catch {\n // ignore\n }\n }\n if (gaugeAddr) {\n // Skip unstake if gauge balance is already 0 (e.g., user pre-unstaked manually)\n if (iface === \"solidly_v2\" && !opts.tokenId) {\n const erc20Abi = parseAbi([\"function balanceOf(address) view returns (uint256)\"]);\n const gClient = createPublicClient({ transport: http(rpcUrl) });\n const gaugeBal = await gClient.readContract({\n address: gaugeAddr, abi: erc20Abi, functionName: \"balanceOf\", args: [recipient],\n }) as bigint;\n if (gaugeBal === 0n) {\n process.stderr.write(\"Step 1/2: Skipped unstake — gauge balance 0 (already unstaked).\\n\");\n didUnstake = true; // mark as success to allow remove\n gaugeAddr = undefined; // skip the unstake block below\n }\n }\n }\n if (gaugeAddr) {\n process.stderr.write(\"Step 1/2: Withdrawing from gauge...\\n\");\n const gaugeAdapter = createGauge(protocol, rpcUrl);\n const tokenId = opts.tokenId ? BigInt(opts.tokenId) : undefined;\n const wOpts = opts.redeemType !== undefined ? { redeemType: parseInt(opts.redeemType, 10) } : undefined;\n if (iface === \"hybra\" && (!wOpts || wOpts.redeemType === 1)) {\n process.stderr.write(\"WARNING: Hybra default redeemType=1 locks rewards into 2-year veHYBR NFT. Pass --redeem-type 0 for instant exit (with penalty).\\n\");\n }\n const withdrawTx = await (gaugeAdapter as { buildWithdraw: (g: Address, a: bigint, t?: bigint, o?: { redeemType?: number }) => Promise<unknown> })\n .buildWithdraw(gaugeAddr, BigInt(opts.liquidity), tokenId, wOpts) as Awaited<ReturnType<typeof gaugeAdapter.buildWithdraw>>;\n const withdrawResult = await executor.execute(withdrawTx);\n printOutput({ step: \"unstake_gauge\", ...withdrawResult }, getOpts());\n if (withdrawResult.status !== \"confirmed\" && withdrawResult.status !== \"simulated\") {\n process.stderr.write(\"Step 2/2: Skipped — unstake did not succeed.\\n\");\n return;\n }\n didUnstake = true;\n }\n }\n\n if (!didUnstake) {\n process.stderr.write(\"Step 1/2: No staking detected — skipping unstake.\\n\");\n }\n\n // Step 2: Remove liquidity\n process.stderr.write(\"Step 2/2: Removing liquidity...\\n\");\n const dexAdapter = createDex(protocol, rpcUrl);\n const removeTx = await dexAdapter.buildRemoveLiquidity({\n protocol: protocol.name,\n token_a: tokenA,\n token_b: tokenB,\n liquidity: BigInt(opts.liquidity),\n recipient,\n token_id: opts.tokenId ? BigInt(opts.tokenId) : undefined,\n });\n const removeResult = await executor.execute(removeTx);\n printOutput({ step: \"lp_remove\", ...removeResult }, getOpts());\n });\n\n // ─────────────────────────────────────────\n // lp compound (collect fees → increaseLiquidity in one tx)\n // ─────────────────────────────────────────\n lp.command(\"compound\")\n .description(\"Auto-compound: collect accrued LP fees and immediately re-add them as liquidity (V3 fee-only protocols).\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--token-id <id>\", \"NFT tokenId of the position to compound\")\n .option(\"--address <address>\", \"Wallet/recipient address (defaults to DEFI_WALLET_ADDRESS)\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in basis points (default 50 = 0.5%). Sets amount0Min/amount1Min on increaseLiquidity to protect against MEV.\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const rpcUrl = chain.effectiveRpcUrl();\n const protocol = registry.getProtocol(opts.protocol);\n const recipient = resolveAccount(opts.address, lp.opts<{ wallet?: string }>().wallet);\n const adapter = createDex(protocol, rpcUrl);\n if (!(\"buildCompound\" in adapter) || typeof (adapter as { buildCompound?: unknown }).buildCompound !== \"function\") {\n throw new Error(`[${protocol.name}] adapter does not support compound (v1 supports V3 fee-only protocols)`);\n }\n const compoundOpts = opts.slippage !== undefined ? { slippageBps: parseInt(opts.slippage, 10) } : undefined;\n const tx = await (adapter as { buildCompound: (tokenId: bigint, recipient: Address, opts?: { slippageBps?: number }) => Promise<unknown> })\n .buildCompound(BigInt(opts.tokenId), recipient, compoundOpts);\n const result = await executor.execute(tx as Parameters<typeof executor.execute>[0]);\n printOutput(result, getOpts());\n });\n\n // ─────────────────────────────────────────\n // lp positions\n // ─────────────────────────────────────────\n lp.command(\"positions\")\n .description(\"Show all LP positions across protocols\")\n .option(\"--protocol <protocol>\", \"Filter to a single protocol slug\")\n .option(\"--pool <address>\", \"Filter to a specific pool address\")\n .option(\"--bins <binIds>\", \"Comma-separated bin IDs (for Merchant Moe LB, auto-detected if omitted)\")\n .option(\"--address <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .action(async (opts) => {\n const chainName = parent.opts<{ chain?: string }>().chain;\n if (!chainName) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const rpcUrl = chain.effectiveRpcUrl();\n const user = resolveAccount(opts.address, lp.opts<{ wallet?: string }>().wallet);\n\n const allProtocols = registry.getProtocolsForChain(chainName);\n const protocols = opts.protocol\n ? [registry.getProtocol(opts.protocol)]\n : allProtocols;\n\n const results: Array<Record<string, unknown>> = [];\n\n await Promise.allSettled(\n protocols.map(async (protocol) => {\n try {\n // Merchant Moe LB positions: scan all rewarded pools (no --pool) or one specific pool\n if (protocol.interface === \"uniswap_v2\" && protocol.contracts?.[\"lb_factory\"]) {\n const adapter = createMerchantMoeLB(protocol, rpcUrl);\n const binIds = opts.bins\n ? (opts.bins as string).split(\",\").map((s: string) => parseInt(s.trim()))\n : undefined;\n const poolsToScan: Address[] = opts.pool\n ? [opts.pool as Address]\n : (await adapter.discoverRewardedPools()).map((p) => p.pool as Address);\n for (const poolAddr of poolsToScan) {\n try {\n const userBins = binIds ?? await adapter.findUserBinsWithBalance(poolAddr, user);\n if (userBins.length === 0) continue;\n const positions = await adapter.getUserPositions(user, poolAddr, userBins);\n if (positions.length === 0) continue;\n // Query pending MOE for these bins\n const pending = await adapter.getPendingRewards(user, poolAddr, userBins).catch(() => []);\n const totalPending = pending.reduce((s, r) => s + (r.amount ?? 0n), 0n);\n for (const pos of positions) {\n results.push({\n protocol: protocol.slug,\n type: \"lb\",\n pool: poolAddr,\n ...pos,\n pending_reward: totalPending.toString(),\n pending_reward_token: pending[0]?.token,\n });\n }\n } catch { /* skip pools the user has no balance in */ }\n }\n }\n\n // V3/Algebra/Hybra NFT positions via position_manager\n const npm = protocol.contracts?.[\"position_manager\"] as Address | undefined;\n if (npm && [\"uniswap_v3\", \"algebra_v3\", \"hybra\"].includes(protocol.interface)) {\n const npmAbi = parseAbi([\n \"function balanceOf(address owner) view returns (uint256)\",\n \"function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)\",\n ]);\n const client = createPublicClient({ transport: http(rpcUrl) });\n let count: bigint;\n try {\n count = await client.readContract({ address: npm, abi: npmAbi, functionName: \"balanceOf\", args: [user] }) as bigint;\n } catch { return; }\n const max = Math.min(Number(count), 50);\n for (let i = 0; i < max; i++) {\n try {\n const tokenId = await client.readContract({\n address: npm, abi: npmAbi, functionName: \"tokenOfOwnerByIndex\", args: [user, BigInt(i)],\n }) as bigint;\n // Try Ramses-CL layout (no nonce/operator) first; fallback to standard.\n const liq = await detectV3Liquidity(client, npm, tokenId);\n if (liq && liq.liquidity > 0n) {\n results.push({\n protocol: protocol.slug,\n type: \"v3_nft\",\n token_id: tokenId.toString(),\n token0: liq.token0,\n token1: liq.token1,\n liquidity: liq.liquidity.toString(),\n tickLower: liq.tickLower,\n tickUpper: liq.tickUpper,\n });\n }\n } catch { /* skip malformed */ }\n }\n }\n } catch {\n // Skip protocols that fail\n }\n }),\n );\n\n printOutput(results, getOpts());\n });\n\n // ─────────────────────────────────────────\n // lp autopilot\n // ─────────────────────────────────────────\n lp.command(\"autopilot\")\n .description(\"Auto-allocate budget across whitelisted pools (reads ~/.defi/pools.toml)\")\n .requiredOption(\"--budget <usd>\", \"Total budget in USD\")\n .option(\"--chain <chain>\", \"Filter whitelist to a specific chain\")\n .option(\"--dry-run\", \"Show plan only (default)\", true)\n .option(\"--broadcast\", \"Execute the plan (lending supply supported; LP types show a warning)\")\n .action(async (opts) => {\n const budgetUsd = parseFloat(opts.budget as string);\n if (isNaN(budgetUsd) || budgetUsd <= 0) {\n printOutput({ error: `Invalid budget: ${opts.budget}` }, getOpts());\n process.exit(1);\n return;\n }\n\n // Step 1: Load whitelist\n let whitelist = loadWhitelist();\n if (whitelist.length === 0) {\n printOutput(\n { error: \"No pools whitelisted. Create ~/.defi/pools.toml (see config/pools.example.toml)\" },\n getOpts(),\n );\n process.exit(1);\n return;\n }\n\n // Filter by --chain if specified\n const chainFilter = (opts.chain as string | undefined)?.toLowerCase();\n if (chainFilter) {\n whitelist = whitelist.filter((e) => e.chain.toLowerCase() === chainFilter);\n if (whitelist.length === 0) {\n printOutput(\n { error: `No whitelisted pools found for chain '${chainFilter}'` },\n getOpts(),\n );\n process.exit(1);\n return;\n }\n }\n\n // Step 2: Scan whitelisted pools — fetch current APY/APR for each entry\n const registry = Registry.loadEmbedded();\n\n interface ScannedEntry {\n entry: WhitelistEntry;\n apy?: number;\n apr?: number;\n active?: boolean;\n scan_error?: string;\n }\n\n const scanned: ScannedEntry[] = await Promise.all(\n whitelist.map(async (entry): Promise<ScannedEntry> => {\n try {\n const chainName = entry.chain.toLowerCase();\n let chain;\n try {\n chain = registry.getChain(chainName);\n } catch {\n return { entry, scan_error: `Unknown chain '${chainName}'` };\n }\n const rpcUrl = chain.effectiveRpcUrl();\n\n // Lending: fetch supply APY via getRates\n if (entry.type === \"lending\" && entry.asset) {\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter(\n (p) =>\n p.category === ProtocolCategory.Lending &&\n p.slug === entry.protocol,\n );\n if (protos.length === 0) {\n return { entry, scan_error: `Protocol not found: ${entry.protocol}` };\n }\n const proto = protos[0]!;\n const assetAddr = registry.resolveToken(chainName, entry.asset).address as Address;\n const adapter = createLending(proto, rpcUrl);\n const rates = await adapter.getRates(assetAddr);\n return { entry, apy: rates.supply_apy };\n }\n\n // LB: fetch APR from discoverRewardedPools\n if (entry.type === \"lb\" && entry.pool) {\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.slug === entry.protocol);\n if (protos.length === 0) {\n return { entry, scan_error: `Protocol not found: ${entry.protocol}` };\n }\n const proto = protos[0]!;\n if (proto.interface === \"uniswap_v2\" && proto.contracts?.[\"lb_factory\"]) {\n const adapter = createMerchantMoeLB(proto, rpcUrl);\n const pools = await adapter.discoverRewardedPools();\n // Match by pool name (pair) or address\n const match = pools.find(\n (p) =>\n p.pool.toLowerCase() === entry.pool!.toLowerCase() ||\n `${p.symbolX}/${p.symbolY}`.toLowerCase() === entry.pool!.toLowerCase() ||\n `${p.symbolY}/${p.symbolX}`.toLowerCase() === entry.pool!.toLowerCase(),\n );\n if (match) {\n return { entry, apr: match.aprPercent, active: !match.stopped };\n }\n }\n return { entry, scan_error: \"Pool not found in LB discovery\" };\n }\n\n // Farming: fetch active status from discoverFarmingPools\n if (entry.type === \"farming\" && entry.pool) {\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.slug === entry.protocol);\n if (protos.length === 0) {\n return { entry, scan_error: `Protocol not found: ${entry.protocol}` };\n }\n const proto = protos[0]!;\n if (proto.interface === \"algebra_v3\" && proto.contracts?.[\"farming_center\"]) {\n const adapter = createKittenSwapFarming(proto, rpcUrl);\n const pools = await adapter.discoverFarmingPools();\n const match = pools.find(\n (p) => p.pool.toLowerCase() === entry.pool!.toLowerCase(),\n );\n if (match) {\n return { entry, active: match.active };\n }\n }\n return { entry, scan_error: \"Pool not found in farming discovery\" };\n }\n\n // Gauge: check if gauge exists\n if (entry.type === \"gauge\" && entry.pool) {\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.slug === entry.protocol);\n if (protos.length === 0) {\n return { entry, scan_error: `Protocol not found: ${entry.protocol}` };\n }\n const proto = protos[0]!;\n if ([\"solidly_v2\", \"solidly_cl\", \"algebra_v3\", \"hybra\"].includes(proto.interface) ||\n (proto.interface === \"uniswap_v3\" && proto.contracts?.[\"voter\"])) {\n const chainTokens = registry.tokens.get(chainName)?.map(t => t.address);\n const adapter = createGauge(proto, rpcUrl, chainTokens);\n if (adapter.discoverGaugedPools) {\n const pools = await adapter.discoverGaugedPools();\n const poolAddr = entry.pool.startsWith(\"0x\")\n ? entry.pool.toLowerCase()\n : undefined;\n const match = pools.find(\n (p) =>\n (poolAddr && p.pool.toLowerCase() === poolAddr) ||\n `${p.token0}/${p.token1}`.toLowerCase() === entry.pool!.toLowerCase() ||\n `${p.token1}/${p.token0}`.toLowerCase() === entry.pool!.toLowerCase(),\n );\n return { entry, active: !!match };\n }\n }\n return { entry, scan_error: \"Gauge discovery not supported for this protocol\" };\n }\n\n return { entry, scan_error: \"Unsupported entry type or missing pool/asset field\" };\n } catch (err) {\n return { entry, scan_error: String(err) };\n }\n }),\n );\n\n // Step 3: Generate allocation plan\n // Reserve 20% of budget as safety margin\n const RESERVE_PCT = 0.20;\n const deployableBudget = budgetUsd * (1 - RESERVE_PCT);\n const reserveUsd = budgetUsd * RESERVE_PCT;\n\n // Sort by yield: lending/lb by APY/APR descending, farming/gauge by active first\n const ranked = [...scanned].sort((a, b) => {\n const scoreA = a.apy ?? a.apr ?? (a.active ? 1 : 0);\n const scoreB = b.apy ?? b.apr ?? (b.active ? 1 : 0);\n return scoreB - scoreA;\n });\n\n // Allocate respecting max_allocation_pct per entry\n const allocations: Array<Record<string, unknown>> = [];\n let remainingBudget = deployableBudget;\n\n for (const s of ranked) {\n if (remainingBudget <= 0) break;\n const maxAlloc = budgetUsd * (s.entry.max_allocation_pct / 100);\n const alloc = Math.min(maxAlloc, remainingBudget);\n if (alloc <= 0) continue;\n\n const item: Record<string, unknown> = {\n protocol: s.entry.protocol,\n chain: s.entry.chain,\n type: s.entry.type,\n amount_usd: Math.round(alloc * 100) / 100,\n };\n if (s.entry.pool) item[\"pool\"] = s.entry.pool;\n if (s.entry.asset) item[\"asset\"] = s.entry.asset;\n if (s.apy !== undefined) item[\"apy\"] = s.apy;\n if (s.apr !== undefined) item[\"apr\"] = s.apr;\n if (s.active !== undefined) item[\"active\"] = s.active;\n if (s.scan_error) item[\"scan_error\"] = s.scan_error;\n\n allocations.push(item);\n remainingBudget -= alloc;\n }\n\n // Add reserve entry\n const totalReserved = reserveUsd + remainingBudget;\n allocations.push({\n reserve: true,\n amount_usd: Math.round(totalReserved * 100) / 100,\n note: \"20% safety margin (hardcoded) + unallocated remainder\",\n });\n\n // Estimate daily/annual yield\n let estimatedAnnualYieldUsd = 0;\n for (const alloc of allocations) {\n if (alloc[\"reserve\"]) continue;\n const amt = alloc[\"amount_usd\"] as number;\n const rate = (alloc[\"apy\"] as number | undefined) ?? (alloc[\"apr\"] as number | undefined);\n if (rate !== undefined && rate > 0) {\n // APY/APR are stored as decimal fractions (e.g. 0.0888 = 8.88%) or percentages (873 = 873%)\n // Use as-is: yield.ts stores supply_apy as a decimal fraction from the protocol adapter\n estimatedAnnualYieldUsd += amt * rate;\n }\n }\n const estimatedDailyYieldUsd = estimatedAnnualYieldUsd / 365;\n\n const isBroadcast = !!(opts.broadcast as boolean | undefined);\n\n const plan = {\n budget_usd: budgetUsd,\n deployable_usd: Math.round(deployableBudget * 100) / 100,\n reserve_pct: RESERVE_PCT * 100,\n allocations,\n estimated_daily_yield_usd: Math.round(estimatedDailyYieldUsd * 100) / 100,\n estimated_annual_yield_usd: Math.round(estimatedAnnualYieldUsd * 100) / 100,\n execution: isBroadcast ? \"broadcast\" : \"dry_run\",\n };\n\n printOutput(plan, getOpts());\n\n if (!isBroadcast) return;\n\n // Step 4: Execute the plan\n process.stderr.write(\"\\nExecuting autopilot plan...\\n\");\n const executor = makeExecutor();\n const execResults: Array<Record<string, unknown>> = [];\n let allocIndex = 0;\n const actionAllocs = allocations.filter((a) => !a[\"reserve\"]);\n\n for (const alloc of actionAllocs) {\n allocIndex++;\n const chainName = (alloc[\"chain\"] as string).toLowerCase();\n let chain;\n try {\n chain = registry.getChain(chainName);\n } catch {\n process.stderr.write(`\\n--- ${allocIndex}/${actionAllocs.length}: ${alloc[\"protocol\"]} — unknown chain '${chainName}', skipping ---\\n`);\n execResults.push({ ...alloc, exec_status: \"skipped\", exec_error: `Unknown chain '${chainName}'` });\n continue;\n }\n const rpc = chain.effectiveRpcUrl();\n\n process.stderr.write(`\\n--- ${allocIndex}/${actionAllocs.length}: ${alloc[\"protocol\"]} (${alloc[\"type\"]}) $${alloc[\"amount_usd\"]} ---\\n`);\n\n if (alloc[\"type\"] === \"lending\" && alloc[\"asset\"]) {\n try {\n const protocol = registry.getProtocol(alloc[\"protocol\"] as string);\n const adapter = createLending(protocol, rpc);\n const tokenInfo = registry.resolveToken(chainName, alloc[\"asset\"] as string);\n const assetAddr = tokenInfo.address as Address;\n const decimals = tokenInfo.decimals ?? 18;\n const amountWei = BigInt(Math.floor((alloc[\"amount_usd\"] as number) * 10 ** decimals));\n const wallet = resolveAccount(undefined, lp.opts<{ wallet?: string }>().wallet);\n const tx = await adapter.buildSupply({\n protocol: alloc[\"protocol\"] as string,\n asset: assetAddr,\n amount: amountWei,\n on_behalf_of: wallet,\n });\n process.stderr.write(` Supplying ${amountWei} wei of ${alloc[\"asset\"]} to ${alloc[\"protocol\"]}...\\n`);\n const result = await executor.execute(tx);\n process.stderr.write(` Status: ${result.status}\\n`);\n const explorerUrl = result.details?.[\"explorer_url\"];\n if (explorerUrl) process.stderr.write(` Explorer: ${explorerUrl}\\n`);\n execResults.push({ ...alloc, exec_status: result.status, tx_hash: result.tx_hash });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(` Error: ${msg}\\n`);\n execResults.push({ ...alloc, exec_status: \"error\", exec_error: msg });\n }\n continue;\n }\n\n // LP / LB / farming / gauge: require manual token preparation for now\n const lpMsg = `LP execution for type '${alloc[\"type\"]}' pool '${alloc[\"pool\"] ?? \"\"}' — requires manual token preparation (swap + addLiquidity not yet automated)`;\n process.stderr.write(` Warning: ${lpMsg}\\n`);\n execResults.push({ ...alloc, exec_status: \"skipped\", exec_note: lpMsg });\n }\n\n process.stderr.write(\"\\nAutopilot execution complete.\\n\");\n printOutput({ execution_results: execResults }, getOpts());\n });\n}\n","import { readFileSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { parse } from \"smol-toml\";\n\nexport interface WhitelistEntry {\n chain: string;\n protocol: string;\n pool?: string; // pool name or address (for LP)\n asset?: string; // asset symbol (for lending)\n type: \"lb\" | \"gauge\" | \"farming\" | \"lending\";\n max_allocation_pct: number;\n}\n\nexport function loadWhitelist(): WhitelistEntry[] {\n const path = resolve(process.env[\"HOME\"] ?? \"~\", \".defi\", \"pools.toml\");\n try {\n const raw = readFileSync(path, \"utf-8\");\n const parsed = parse(raw) as { whitelist?: WhitelistEntry[] };\n return parsed.whitelist ?? [];\n } catch {\n return []; // No whitelist file = empty\n }\n}\n","import type { Address } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { OwsEvmSigner } from \"./ows-evm.js\";\n\n/**\n * Determine signing method: OWS vault, private key, or address-only.\n *\n * Priority:\n * 1. Explicit --wallet flag -> OWS signer\n * 2. DEFI_WALLET_ADDRESS starting with \"ows:\" -> OWS signer\n * 3. DEFI_PRIVATE_KEY -> derive address (signer = null, executor uses key directly)\n * 4. DEFI_WALLET_ADDRESS -> address-only (read-only / dry-run)\n */\nexport function resolveWalletWithSigner(\n opts?: { wallet?: string; passphrase?: string },\n): { address: Address; signer: OwsEvmSigner | null } {\n // 1. Explicit --wallet flag\n if (opts?.wallet) {\n const signer = OwsEvmSigner.create(opts.wallet, opts.passphrase);\n return { address: signer.getAddress() as Address, signer };\n }\n\n // 2. DEFI_WALLET_ADDRESS with \"ows:\" prefix\n const envWallet = process.env[\"DEFI_WALLET_ADDRESS\"];\n if (envWallet?.startsWith(\"ows:\")) {\n const walletName = envWallet.slice(4);\n const signer = OwsEvmSigner.create(walletName);\n return { address: signer.getAddress() as Address, signer };\n }\n\n // 3. DEFI_PRIVATE_KEY -> derive address\n const pk = process.env[\"DEFI_PRIVATE_KEY\"];\n if (pk) {\n return { address: privateKeyToAccount(pk as `0x${string}`).address, signer: null };\n }\n\n // 4. Plain DEFI_WALLET_ADDRESS\n if (envWallet) {\n return { address: envWallet as Address, signer: null };\n }\n\n throw new Error(\n \"No wallet configured. Use --wallet <name>, set DEFI_WALLET_ADDRESS, or set DEFI_PRIVATE_KEY\",\n );\n}\n","import { createRequire } from \"node:module\";\n\nconst _require = createRequire(import.meta.url);\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/** Lazy-load the OWS native module (NAPI binding, requires CJS require). */\nexport function loadOws(): any {\n try {\n return _require(\"@open-wallet-standard/core\");\n } catch {\n throw new Error(\n \"OWS not installed. Run: curl -fsSL https://docs.openwallet.sh/install.sh | bash\",\n );\n }\n}\n","import { loadOws } from \"./ows-loader.js\";\n\n/**\n * EVM signer backed by Open Wallet Standard.\n * Keys never leave the OWS encrypted vault.\n */\nexport class OwsEvmSigner {\n private _address: string;\n private _walletName: string;\n private _passphrase: string;\n\n private constructor(walletName: string, address: string, passphrase: string) {\n this._walletName = walletName;\n this._address = address;\n this._passphrase = passphrase;\n }\n\n static create(walletName: string, passphrase = \"\"): OwsEvmSigner {\n const ows = loadOws();\n const wallet = ows.getWallet(walletName);\n const evmAccount = wallet.accounts.find(\n (a: { chainId: string }) => a.chainId.startsWith(\"eip155:\"),\n );\n if (!evmAccount) {\n throw new Error(`OWS wallet \"${walletName}\" has no EVM account`);\n }\n return new OwsEvmSigner(walletName, evmAccount.address, passphrase);\n }\n\n getAddress(): string {\n return this._address;\n }\n\n async signTypedData(\n domain: Record<string, unknown>,\n types: Record<string, Array<{ name: string; type: string }>>,\n value: Record<string, unknown>,\n ): Promise<string> {\n const ows = loadOws();\n\n const typedData = JSON.stringify({\n types: {\n EIP712Domain: Object.keys(domain).map((key) => ({\n name: key,\n type: inferEip712DomainType(key),\n })),\n ...types,\n },\n primaryType: Object.keys(types)[0],\n domain,\n message: value,\n });\n\n const result = ows.signTypedData(this._walletName, \"evm\", typedData, this._passphrase);\n\n const sig = result.signature.startsWith(\"0x\") ? result.signature : `0x${result.signature}`;\n const v = result.recoveryId !== undefined ? result.recoveryId + 27 : 27;\n return `${sig}${v.toString(16).padStart(2, \"0\")}`;\n }\n\n async signMessage(message: string | Uint8Array): Promise<string> {\n const ows = loadOws();\n\n const msgStr = typeof message === \"string\"\n ? message\n : Buffer.from(message).toString(\"hex\");\n const encoding = typeof message === \"string\" ? \"utf8\" : \"hex\";\n\n const result = ows.signMessage(this._walletName, \"evm\", msgStr, this._passphrase, encoding);\n\n const sig = result.signature.startsWith(\"0x\") ? result.signature : `0x${result.signature}`;\n const v = result.recoveryId !== undefined ? result.recoveryId + 27 : 27;\n return `${sig}${v.toString(16).padStart(2, \"0\")}`;\n }\n\n /**\n * Sign a raw serialized transaction for viem compatibility.\n * Returns the signed transaction as a hex string.\n */\n async signTransaction(serializedTx: string): Promise<string> {\n const ows = loadOws();\n\n const txHex = serializedTx.startsWith(\"0x\") ? serializedTx.slice(2) : serializedTx;\n const result = ows.signMessage(this._walletName, \"evm\", txHex, this._passphrase, \"hex\");\n\n const sig = result.signature.startsWith(\"0x\") ? result.signature : `0x${result.signature}`;\n const v = result.recoveryId !== undefined ? result.recoveryId + 27 : 27;\n return `${sig}${v.toString(16).padStart(2, \"0\")}`;\n }\n}\n\nfunction inferEip712DomainType(key: string): string {\n switch (key) {\n case \"chainId\": return \"uint256\";\n case \"verifyingContract\": return \"address\";\n case \"salt\": return \"bytes32\";\n default: return \"string\";\n }\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport type { Executor } from \"../executor.js\";\nimport { printOutput } from \"../output.js\";\nimport { InterestRateMode } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\nimport { createLending } from \"@hypurrquant/defi-protocols\";\nimport { resolveContext, resolveTokenAddress, resolveWallet } from \"../utils.js\";\n\nexport function registerLending(parent: Command, getOpts: () => OutputMode, makeExecutor: () => Executor): void {\n const lending = parent.command(\"lending\").description(\"Lending operations: supply, borrow, repay, withdraw, rates, position\");\n\n lending.command(\"rates\")\n .description(\"Show current lending rates\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .action(async (opts) => {\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const asset = resolveTokenAddress(ctx.registry, ctx.chainName, opts.asset);\n const rates = await adapter.getRates(asset);\n printOutput(rates, getOpts());\n });\n\n lending.command(\"position\")\n .description(\"Show current lending position\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .option(\"--address <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .action(async (opts) => {\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const address = (opts.address ?? process.env[\"DEFI_WALLET_ADDRESS\"]) as Address | undefined;\n if (!address) { printOutput({ error: \"--address required (or set DEFI_WALLET_ADDRESS)\" }, getOpts()); return; }\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const position = await adapter.getUserPosition(address);\n printOutput(position, getOpts());\n });\n\n lending.command(\"supply\")\n .description(\"Supply an asset to a lending protocol\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount to supply in wei\")\n .option(\"--on-behalf-of <address>\", \"On behalf of address\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const asset = resolveTokenAddress(ctx.registry, ctx.chainName, opts.asset);\n const onBehalfOf = resolveWallet(opts.onBehalfOf);\n const tx = await adapter.buildSupply({ protocol: ctx.protocol!.name, asset, amount: BigInt(opts.amount), on_behalf_of: onBehalfOf });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n\n lending.command(\"borrow\")\n .description(\"Borrow an asset\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount in wei\")\n .option(\"--rate-mode <mode>\", \"variable or stable\", \"variable\")\n .option(\"--on-behalf-of <address>\", \"On behalf of address\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const asset = resolveTokenAddress(ctx.registry, ctx.chainName, opts.asset);\n const onBehalfOf = resolveWallet(opts.onBehalfOf);\n const tx = await adapter.buildBorrow({\n protocol: ctx.protocol!.name, asset, amount: BigInt(opts.amount),\n interest_rate_mode: opts.rateMode === \"stable\" ? InterestRateMode.Stable : InterestRateMode.Variable,\n on_behalf_of: onBehalfOf,\n });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n\n lending.command(\"repay\")\n .description(\"Repay a borrowed asset\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount in wei\")\n .option(\"--rate-mode <mode>\", \"variable or stable\", \"variable\")\n .option(\"--on-behalf-of <address>\", \"On behalf of address\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const asset = resolveTokenAddress(ctx.registry, ctx.chainName, opts.asset);\n const onBehalfOf = resolveWallet(opts.onBehalfOf);\n const tx = await adapter.buildRepay({\n protocol: ctx.protocol!.name, asset, amount: BigInt(opts.amount),\n interest_rate_mode: opts.rateMode === \"stable\" ? InterestRateMode.Stable : InterestRateMode.Variable,\n on_behalf_of: onBehalfOf,\n });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n\n lending.command(\"withdraw\")\n .description(\"Withdraw a supplied asset\")\n .requiredOption(\"--protocol <protocol>\", \"Protocol slug\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount in wei\")\n .option(\"--to <address>\", \"Recipient address\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const ctx = resolveContext(parent, getOpts, opts.protocol);\n if (!ctx) return;\n const adapter = createLending(ctx.protocol!, ctx.rpcUrl);\n const asset = resolveTokenAddress(ctx.registry, ctx.chainName, opts.asset);\n const to = resolveWallet(opts.to);\n const tx = await adapter.buildWithdraw({ protocol: ctx.protocol!.name, asset, amount: BigInt(opts.amount), to });\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n}\n","import type { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport type { OutputMode } from \"./output.js\";\nimport { printOutput } from \"./output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport type { ProtocolEntry, ChainConfig } from \"@hypurrquant/defi-core\";\nimport { resolveWalletWithSigner } from \"./signer/resolve.js\";\n\n// ── Chain validation ──\n\n/**\n * Get chain name from global --chain option, or null with error output if missing.\n * For commands that require a specific chain (transactions, single-chain queries).\n */\nexport function requireChain(parent: Command, getOpts: () => OutputMode): string | null {\n const chain = parent.opts<{ chain?: string }>().chain;\n if (!chain) {\n printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts());\n return null;\n }\n return chain.toLowerCase();\n}\n\n/**\n * Get chain name if explicitly passed, or all chain keys if not.\n * For commands that scan all chains by default (yield, status).\n */\nexport function getChainKeys(parent: Command, registry: Registry): string[] {\n const chain = parent.opts<{ chain?: string }>().chain;\n return chain ? [chain.toLowerCase()] : Array.from(registry.chains.keys());\n}\n\n// ── Context resolution ──\n\nexport interface CommandContext {\n chainName: string;\n registry: Registry;\n chain: ChainConfig;\n rpcUrl: string;\n protocol?: ProtocolEntry;\n}\n\n/**\n * Resolve chain + registry + optional protocol in one call.\n * Returns null (with error output) if --chain is missing.\n */\nexport function resolveContext(\n parent: Command,\n getOpts: () => OutputMode,\n protocolSlug?: string,\n): CommandContext | null {\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return null;\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const protocol = protocolSlug ? registry.getProtocol(protocolSlug) : undefined;\n return { chainName, registry, chain, rpcUrl: chain.effectiveRpcUrl(), protocol };\n}\n\n// ── Token resolution ──\n\n/**\n * Resolve token symbol or address to Address.\n */\nexport function resolveTokenAddress(registry: Registry, chainName: string, tokenOrAddress: string): Address {\n if (/^0x[0-9a-fA-F]{40}$/.test(tokenOrAddress)) return tokenOrAddress as Address;\n return registry.resolveToken(chainName, tokenOrAddress).address;\n}\n\n// ── Wallet address ──\n\nconst FALLBACK_ADDRESS = \"0x0000000000000000000000000000000000000001\" as Address;\n\n/**\n * Resolve wallet address from explicit option, env var (including OWS), or fallback.\n */\nexport function resolveWallet(override?: string): Address {\n if (override) return override as Address;\n try {\n const { address } = resolveWalletWithSigner();\n return address;\n } catch {\n return FALLBACK_ADDRESS;\n }\n}\n\n// ── Error formatting ──\n\n/**\n * Extract error message from unknown error.\n */\nexport function errMsg(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\n// ── Value parsing ──\n\n/**\n * Parse a hex or decimal string to BigInt (for tx value fields).\n */\nexport function parseBigIntValue(v: string): bigint {\n return v.startsWith(\"0x\") ? BigInt(v) : BigInt(v || 0);\n}\n","import type { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { Registry, ProtocolCategory } from \"@hypurrquant/defi-core\";\nimport type { LendingRates } from \"@hypurrquant/defi-core\";\nimport { createLending, createVault } from \"@hypurrquant/defi-protocols\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport type { Executor } from \"../executor.js\";\n\nfunction resolveAsset(registry: Registry, chain: string, asset: string): Address {\n // Try parsing as address first\n if (/^0x[0-9a-fA-F]{40}$/.test(asset)) {\n return asset as Address;\n }\n return registry.resolveToken(chain, asset).address;\n}\n\n/** Collect lending rates for all lending protocols */\nasync function collectLendingRates(\n registry: Registry,\n chainName: string,\n rpc: string,\n assetAddr: Address,\n): Promise<LendingRates[]> {\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending);\n\n const results: LendingRates[] = [];\n let first = true;\n\n for (const proto of protos) {\n if (!first) {\n // Small delay between calls to avoid rate limiting\n await new Promise((r) => setTimeout(r, 500));\n }\n first = false;\n\n try {\n const lending = createLending(proto, rpc);\n const rates = await lending.getRates(assetAddr);\n results.push(rates);\n } catch (err) {\n process.stderr.write(`Warning: ${proto.name} rates unavailable: ${err}\\n`);\n }\n }\n\n return results;\n}\n\n/** Collect all yield opportunities: lending + morpho + vaults */\nasync function collectAllYields(\n registry: Registry,\n chainName: string,\n rpc: string,\n asset: string,\n assetAddr: Address,\n): Promise<unknown[]> {\n const opportunities: unknown[] = [];\n\n // 1. Aave V3 lending rates\n const lendingRates = await collectLendingRates(registry, chainName, rpc, assetAddr);\n for (const r of lendingRates) {\n if (r.supply_apy > 0) {\n opportunities.push({\n protocol: r.protocol,\n type: \"lending_supply\",\n asset,\n apy: r.supply_apy,\n utilization: r.utilization,\n });\n }\n }\n\n // 2. Morpho Blue rates\n const chainProtos = registry.getProtocolsForChain(chainName);\n for (const proto of chainProtos) {\n if (proto.category === ProtocolCategory.Lending && proto.interface === \"morpho_blue\") {\n try {\n const lending = createLending(proto, rpc);\n const rates = await lending.getRates(assetAddr);\n if (rates.supply_apy > 0) {\n opportunities.push({\n protocol: rates.protocol,\n type: \"morpho_vault\",\n asset,\n apy: rates.supply_apy,\n utilization: rates.utilization,\n });\n }\n } catch {\n // skip\n }\n }\n }\n\n // 3. ERC-4626 vaults\n for (const proto of chainProtos) {\n if (proto.category === ProtocolCategory.Vault && proto.interface === \"erc4626\") {\n try {\n const vault = createVault(proto, rpc);\n const info = await vault.getVaultInfo();\n opportunities.push({\n protocol: info.protocol,\n type: \"vault\",\n asset,\n apy: info.apy ?? 0,\n total_assets: info.total_assets.toString(),\n });\n } catch {\n // skip\n }\n }\n }\n\n // Sort by APY descending\n opportunities.sort((a, b) => {\n const aa = (a as Record<string, unknown>)[\"apy\"] as number ?? 0;\n const ba = (b as Record<string, unknown>)[\"apy\"] as number ?? 0;\n return ba - aa;\n });\n\n return opportunities;\n}\n\n/** Scan all chains in parallel for best yield on an asset */\nasync function runYieldScan(registry: Registry, asset: string, output: OutputMode): Promise<void> {\n const t0 = Date.now();\n const chainKeys = Array.from(registry.chains.keys());\n\n const tasks = chainKeys.map(async (ck) => {\n try {\n const chain = registry.getChain(ck);\n const chainName = chain.name.toLowerCase();\n\n let assetAddr: Address;\n try {\n assetAddr = registry.resolveToken(chainName, asset).address;\n } catch {\n return [];\n }\n\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending);\n\n if (protos.length === 0) return [];\n\n const rpc = chain.effectiveRpcUrl();\n const rates: unknown[] = [];\n\n for (const proto of protos) {\n try {\n const lending = createLending(proto, rpc);\n const r = await lending.getRates(assetAddr);\n if (r.supply_apy > 0) {\n rates.push({\n chain: chain.name,\n protocol: r.protocol,\n supply_apy: r.supply_apy,\n borrow_variable_apy: r.borrow_variable_apy,\n });\n }\n } catch {\n // skip\n }\n }\n\n return rates;\n } catch {\n return [];\n }\n });\n\n const nested = await Promise.all(tasks);\n const allRates = nested.flat() as Array<Record<string, unknown>>;\n\n // Sort by supply APY descending\n allRates.sort((a, b) => (b[\"supply_apy\"] as number ?? 0) - (a[\"supply_apy\"] as number ?? 0));\n\n const best =\n allRates.length > 0\n ? `${allRates[0][\"protocol\"]} on ${allRates[0][\"chain\"]}`\n : null;\n\n // Find arb opportunities (supply on A, borrow on B)\n const arbs: unknown[] = [];\n for (const s of allRates) {\n for (const b of allRates) {\n const sp = s[\"supply_apy\"] as number ?? 0;\n const bp = b[\"borrow_variable_apy\"] as number ?? 0;\n if (sp > bp && bp > 0) {\n const sc = s[\"chain\"] as string;\n const bc = b[\"chain\"] as string;\n const sp2 = s[\"protocol\"] as string;\n const bp2 = b[\"protocol\"] as string;\n if (sc !== bc || sp2 !== bp2) {\n arbs.push({\n spread_pct: Math.round((sp - bp) * 100) / 100,\n supply_chain: sc,\n supply_protocol: sp2,\n supply_apy: sp,\n borrow_chain: bc,\n borrow_protocol: bp2,\n borrow_apy: bp,\n strategy: sc === bc ? \"same-chain\" : \"cross-chain\",\n });\n }\n }\n }\n }\n\n arbs.sort((a, b) => {\n const as_ = (a as Record<string, unknown>)[\"spread_pct\"] as number ?? 0;\n const bs_ = (b as Record<string, unknown>)[\"spread_pct\"] as number ?? 0;\n return bs_ - as_;\n });\n arbs.splice(10); // Top 10\n\n printOutput(\n {\n asset,\n scan_duration_ms: Date.now() - t0,\n chains_scanned: chainKeys.length,\n rates: allRates,\n best_supply: best,\n arb_opportunities: arbs,\n },\n output,\n );\n}\n\n/** Scan rate entry with slug for execute subcommand */\ninterface ScanRate {\n chain: string;\n protocol: string;\n slug: string;\n supply_apy: number;\n borrow_variable_apy: number;\n}\n\n/** Run a cross-chain yield scan and return typed rate entries */\nasync function scanRatesForExecute(registry: Registry, asset: string): Promise<ScanRate[]> {\n const chainKeys = Array.from(registry.chains.keys());\n\n const tasks = chainKeys.map(async (ck): Promise<ScanRate[]> => {\n try {\n const chain = registry.getChain(ck);\n const chainName = chain.name.toLowerCase();\n let assetAddr: Address;\n try {\n assetAddr = registry.resolveToken(chainName, asset).address;\n } catch {\n return [];\n }\n const protos = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending);\n if (protos.length === 0) return [];\n const rpc = chain.effectiveRpcUrl();\n const rates: ScanRate[] = [];\n for (const proto of protos) {\n try {\n const lending = createLending(proto, rpc);\n const r = await lending.getRates(assetAddr);\n if (r.supply_apy > 0) {\n rates.push({\n chain: chain.name,\n protocol: r.protocol,\n slug: proto.slug,\n supply_apy: r.supply_apy,\n borrow_variable_apy: r.borrow_variable_apy,\n });\n }\n } catch {\n // skip unreachable\n }\n }\n return rates;\n } catch {\n return [];\n }\n });\n\n const nested = await Promise.all(tasks);\n const all = nested.flat();\n all.sort((a, b) => b.supply_apy - a.supply_apy);\n return all;\n}\n\nexport function registerYield(parent: Command, getOpts: () => OutputMode, makeExecutor: () => Executor): void {\n const yieldCmd = parent\n .command(\"yield\")\n .description(\"Yield operations: compare, scan, optimize, execute\");\n\n // bare `defi yield` shows help — use `yield scan` / `yield compare` / `yield optimize` / `yield execute`.\n // (Earlier the parent owned `--asset`, which collided with the same flag on every subcommand and\n // caused subcommand `requiredOption(\"--asset\")` parsing to fail.)\n\n // yield compare\n yieldCmd\n .command(\"compare\")\n .description(\"Compare lending rates across protocols for an asset\")\n .option(\"--asset <token>\", \"Token symbol or address\", \"USDC\")\n .action(async (opts) => {\n try {\n const registry = Registry.loadEmbedded();\n const specChain = parent.opts<{ chain?: string }>().chain;\n if (!specChain) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const chainName: string = specChain.toLowerCase();\n const chain = registry.getChain(chainName);\n const rpc = chain.effectiveRpcUrl();\n const assetAddr = resolveAsset(registry, chainName, opts.asset as string);\n\n const results = await collectLendingRates(registry, chainName, rpc, assetAddr);\n\n if (results.length === 0) {\n printOutput(\n { error: `No lending rate data available for asset '${opts.asset}'` },\n getOpts(),\n );\n process.exit(1);\n return;\n }\n\n results.sort((a, b) => b.supply_apy - a.supply_apy);\n\n const bestSupply = results[0]?.protocol ?? null;\n const bestBorrow =\n results.reduce((best, r) => {\n if (!best || r.borrow_variable_apy < best.borrow_variable_apy) return r;\n return best;\n }, null as LendingRates | null)?.protocol ?? null;\n\n printOutput(\n {\n asset: opts.asset,\n rates: results,\n best_supply: bestSupply,\n best_borrow: bestBorrow,\n },\n getOpts(),\n );\n } catch (err) {\n printOutput({ error: String(err) }, getOpts());\n process.exit(1);\n }\n });\n\n // yield scan\n yieldCmd\n .command(\"scan\")\n .description(\"Scan all chains for best yield opportunities (parallel)\")\n .option(\"--asset <token>\", \"Token symbol (e.g. USDC, WETH)\", \"USDC\")\n .action(async (opts) => {\n try {\n const registry = Registry.loadEmbedded();\n await runYieldScan(registry, (opts.asset ?? \"USDC\") as string, getOpts());\n } catch (err) {\n printOutput({ error: String(err) }, getOpts());\n process.exit(1);\n }\n });\n\n // yield execute\n yieldCmd\n .command(\"execute\")\n .description(\"Find the best yield opportunity and execute supply (or show cross-chain plan)\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address (e.g. USDC)\")\n .requiredOption(\"--amount <amount>\", \"Human-readable amount to supply (e.g. 1000)\")\n .option(\"--min-spread <percent>\", \"Minimum spread % required to execute cross-chain arb\", \"1.0\")\n .option(\"--target-chain <chain>\", \"Override auto-detected best chain\")\n .option(\"--target-protocol <protocol>\", \"Override auto-detected best protocol slug\")\n .action(async (opts) => {\n try {\n const registry = Registry.loadEmbedded();\n const asset = opts.asset as string;\n const humanAmount = parseFloat(opts.amount as string);\n if (isNaN(humanAmount) || humanAmount <= 0) {\n printOutput({ error: `Invalid amount: ${opts.amount}` }, getOpts());\n process.exit(1);\n return;\n }\n const minSpread = parseFloat((opts.minSpread as string) ?? \"1.0\");\n\n let targetChainName: string;\n let targetProtocolSlug: string | undefined = opts.targetProtocol as string | undefined;\n\n if (opts.targetChain) {\n // Manual chain override — skip scan\n targetChainName = (opts.targetChain as string).toLowerCase();\n } else {\n // Run cross-chain scan to find best supply opportunity\n process.stderr.write(`Scanning all chains for best ${asset} yield...\\n`);\n const t0 = Date.now();\n const allRates = await scanRatesForExecute(registry, asset);\n process.stderr.write(`Scan done in ${Date.now() - t0}ms — ${allRates.length} rates found\\n`);\n\n if (allRates.length === 0) {\n printOutput({ error: `No yield opportunities found for ${asset}` }, getOpts());\n process.exit(1);\n return;\n }\n\n // Find best cross-chain arb (highest spread)\n let bestArb: {\n spread_pct: number;\n supply_chain: string;\n supply_protocol: string;\n supply_slug: string;\n supply_apy: number;\n borrow_chain: string;\n borrow_protocol: string;\n borrow_apy: number;\n strategy: string;\n } | null = null;\n\n for (const s of allRates) {\n for (const b of allRates) {\n const spread = s.supply_apy - b.borrow_variable_apy;\n if (spread > 0 && b.borrow_variable_apy > 0 && (s.chain !== b.chain || s.slug !== b.slug)) {\n if (!bestArb || spread > bestArb.spread_pct) {\n bestArb = {\n spread_pct: Math.round(spread * 10000) / 10000,\n supply_chain: s.chain,\n supply_protocol: s.protocol,\n supply_slug: s.slug,\n supply_apy: s.supply_apy,\n borrow_chain: b.chain,\n borrow_protocol: b.protocol,\n borrow_apy: b.borrow_variable_apy,\n strategy: s.chain === b.chain ? \"same-chain\" : \"cross-chain\",\n };\n }\n }\n }\n }\n\n // If best arb is cross-chain and meets min-spread: output plan only (no execution)\n if (bestArb && bestArb.strategy === \"cross-chain\" && bestArb.spread_pct >= minSpread) {\n const supplyChainLower = bestArb.supply_chain.toLowerCase();\n let supplyAssetAddr: Address | undefined;\n let supplyDecimals = 18;\n try {\n const tok = registry.resolveToken(supplyChainLower, asset);\n supplyAssetAddr = tok.address;\n supplyDecimals = tok.decimals;\n } catch {\n // leave as undefined\n }\n const amountWei = BigInt(Math.round(humanAmount * 10 ** supplyDecimals));\n\n printOutput(\n {\n mode: \"plan_only\",\n reason: \"cross-chain arb requires manual bridge execution\",\n asset,\n amount_human: humanAmount,\n amount_wei: amountWei.toString(),\n best_arb: bestArb,\n steps: [\n {\n step: 1,\n action: \"bridge\",\n description: `Bridge ${humanAmount} ${asset} from current chain to ${bestArb.supply_chain}`,\n from_chain: \"current\",\n to_chain: bestArb.supply_chain,\n token: asset,\n amount_wei: amountWei.toString(),\n },\n {\n step: 2,\n action: \"supply\",\n description: `Supply ${humanAmount} ${asset} on ${bestArb.supply_protocol}`,\n chain: bestArb.supply_chain,\n protocol: bestArb.supply_protocol,\n protocol_slug: bestArb.supply_slug,\n asset_address: supplyAssetAddr,\n amount_wei: amountWei.toString(),\n expected_apy: bestArb.supply_apy,\n },\n ],\n expected_spread_pct: bestArb.spread_pct,\n supply_apy: bestArb.supply_apy,\n borrow_apy: bestArb.borrow_apy,\n },\n getOpts(),\n );\n return;\n }\n\n // Fall through to same-chain supply on the best rate\n targetChainName = allRates[0].chain.toLowerCase();\n if (!targetProtocolSlug) {\n targetProtocolSlug = allRates[0].slug;\n }\n }\n\n // Same-chain supply execution path\n const chain = registry.getChain(targetChainName);\n const chainName = chain.name.toLowerCase();\n const rpc = chain.effectiveRpcUrl();\n\n // Resolve asset address + decimals on target chain\n let assetAddr: Address;\n let decimals = 18;\n try {\n const tok = registry.resolveToken(chainName, asset);\n assetAddr = tok.address;\n decimals = tok.decimals;\n } catch {\n if (/^0x[0-9a-fA-F]{40}$/.test(asset)) {\n assetAddr = asset as Address;\n } else {\n printOutput({ error: `Cannot resolve ${asset} on chain ${chainName}` }, getOpts());\n process.exit(1);\n return;\n }\n }\n\n const amountWei = BigInt(Math.round(humanAmount * 10 ** decimals));\n\n // Resolve protocol\n let proto: ReturnType<typeof registry.getProtocol>;\n if (targetProtocolSlug) {\n try {\n proto = registry.getProtocol(targetProtocolSlug);\n } catch {\n printOutput({ error: `Protocol not found: ${targetProtocolSlug}` }, getOpts());\n process.exit(1);\n return;\n }\n } else {\n // Pick the aave_v3 protocol on the target chain with highest supply APY\n const candidates = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending);\n if (candidates.length === 0) {\n printOutput({ error: `No aave_v3 lending protocol found on ${chainName}` }, getOpts());\n process.exit(1);\n return;\n }\n let bestRate: LendingRates | null = null;\n let bestProto = candidates[0];\n for (const c of candidates) {\n try {\n const lending = createLending(c, rpc);\n const r = await lending.getRates(assetAddr);\n if (!bestRate || r.supply_apy > bestRate.supply_apy) {\n bestRate = r;\n bestProto = c;\n }\n } catch {\n // skip\n }\n }\n proto = bestProto;\n }\n\n const onBehalfOf = (\n process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\"\n ) as Address;\n const adapter = createLending(proto, rpc);\n\n // Fetch current rate for display (non-fatal)\n let currentApy: number | undefined;\n try {\n const r = await adapter.getRates(assetAddr);\n currentApy = r.supply_apy;\n } catch {\n // non-fatal\n }\n\n process.stderr.write(\n `Supplying ${humanAmount} ${asset} (${amountWei} wei) on ${proto.name} (${chain.name})...\\n`,\n );\n\n const executor = makeExecutor();\n const tx = await adapter.buildSupply({\n protocol: proto.name,\n asset: assetAddr,\n amount: amountWei,\n on_behalf_of: onBehalfOf,\n });\n\n const result = await executor.execute(tx);\n\n printOutput(\n {\n action: \"yield_execute\",\n asset,\n amount_human: humanAmount,\n amount_wei: amountWei.toString(),\n chain: chain.name,\n protocol: proto.name,\n protocol_slug: proto.slug,\n supply_apy: currentApy,\n result,\n },\n getOpts(),\n );\n } catch (err) {\n printOutput({ error: String(err) }, getOpts());\n process.exit(1);\n }\n });\n\n // yield optimize\n yieldCmd\n .command(\"optimize\")\n .description(\"Find the optimal yield strategy for an asset\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .option(\"--strategy <strategy>\", \"Strategy: best-supply, leverage-loop, auto\", \"auto\")\n .option(\"--amount <amount>\", \"Amount to deploy (for allocation breakdown)\")\n .action(async (opts) => {\n try {\n const registry = Registry.loadEmbedded();\n const specChain = parent.opts<{ chain?: string }>().chain;\n if (!specChain) { printOutput({ error: \"--chain is required (e.g. --chain hyperevm)\" }, getOpts()); return; }\n const chainName: string = specChain.toLowerCase();\n const chain = registry.getChain(chainName);\n const rpc = chain.effectiveRpcUrl();\n const asset = opts.asset as string;\n const assetAddr = resolveAsset(registry, chainName, asset);\n const strategy = (opts.strategy as string) ?? \"auto\";\n\n if (strategy === \"auto\") {\n const opportunities = await collectAllYields(registry, chainName, rpc, asset, assetAddr);\n\n if (opportunities.length === 0) {\n printOutput({ error: `No yield opportunities found for '${asset}'` }, getOpts());\n process.exit(1);\n return;\n }\n\n const amount = opts.amount ? parseFloat(opts.amount as string) : null;\n const weights = [0.6, 0.3, 0.1];\n const allocations =\n amount !== null\n ? opportunities.slice(0, weights.length).map((opp, i) => ({\n protocol: (opp as Record<string, unknown>)[\"protocol\"],\n type: (opp as Record<string, unknown>)[\"type\"],\n apy: (opp as Record<string, unknown>)[\"apy\"],\n allocation_pct: weights[i] * 100,\n amount: (amount * weights[i]).toFixed(2),\n }))\n : [];\n\n const best = opportunities[0] as Record<string, unknown>;\n const weightedApy =\n allocations.length > 0\n ? opportunities.slice(0, weights.length).reduce((sum: number, o, i) => {\n return sum + ((o as Record<string, unknown>)[\"apy\"] as number ?? 0) * weights[i];\n }, 0)\n : (best[\"apy\"] as number ?? 0);\n\n printOutput(\n {\n strategy: \"auto\",\n asset,\n best_protocol: best[\"protocol\"],\n best_apy: best[\"apy\"],\n weighted_apy: weightedApy,\n opportunities,\n allocation: allocations,\n },\n getOpts(),\n );\n } else if (strategy === \"best-supply\") {\n const results = await collectLendingRates(registry, chainName, rpc, assetAddr);\n\n if (results.length === 0) {\n printOutput({ error: `No lending rate data available for asset '${asset}'` }, getOpts());\n process.exit(1);\n return;\n }\n\n results.sort((a, b) => b.supply_apy - a.supply_apy);\n const best = results[0];\n const recommendations = results.map((r) => ({\n protocol: r.protocol,\n supply_apy: r.supply_apy,\n action: \"supply\",\n }));\n\n printOutput(\n {\n strategy: \"best-supply\",\n asset,\n recommendation: `Supply ${asset} on ${best.protocol} for ${(best.supply_apy * 100).toFixed(2)}% APY`,\n best_protocol: best.protocol,\n best_supply_apy: best.supply_apy,\n all_options: recommendations,\n },\n getOpts(),\n );\n } else if (strategy === \"leverage-loop\") {\n const results = await collectLendingRates(registry, chainName, rpc, assetAddr);\n\n if (results.length === 0) {\n printOutput({ error: `No lending rate data available for asset '${asset}'` }, getOpts());\n process.exit(1);\n return;\n }\n\n const ltv = 0.8;\n const loops = 5;\n const candidates: unknown[] = [];\n\n for (const r of results) {\n const threshold = r.borrow_variable_apy * 0.8;\n if (r.supply_apy > threshold && r.borrow_variable_apy > 0) {\n let effectiveSupplyApy = 0;\n let effectiveBorrowApy = 0;\n let leverage = 1.0;\n for (let l = 0; l < loops; l++) {\n effectiveSupplyApy += r.supply_apy * leverage;\n effectiveBorrowApy += r.borrow_variable_apy * leverage * ltv;\n leverage *= ltv;\n }\n candidates.push({\n protocol: r.protocol,\n supply_apy: r.supply_apy,\n borrow_variable_apy: r.borrow_variable_apy,\n loops,\n ltv,\n effective_supply_apy: effectiveSupplyApy,\n effective_borrow_cost: effectiveBorrowApy,\n net_apy: effectiveSupplyApy - effectiveBorrowApy,\n });\n }\n }\n\n candidates.sort((a, b) => {\n const an = (a as Record<string, unknown>)[\"net_apy\"] as number ?? 0;\n const bn = (b as Record<string, unknown>)[\"net_apy\"] as number ?? 0;\n return bn - an;\n });\n\n const recommendation =\n candidates.length > 0\n ? (() => {\n const b = candidates[0] as Record<string, unknown>;\n return `Leverage loop ${asset} on ${b[\"protocol\"]} — net APY: ${((b[\"net_apy\"] as number) * 100).toFixed(2)}% (${loops} loops at ${ltv * 100}% LTV)`;\n })()\n : `No favorable leverage loop found for ${asset} — supply rate too low relative to borrow rate`;\n\n printOutput(\n {\n strategy: \"leverage-loop\",\n asset,\n recommendation,\n candidates,\n },\n getOpts(),\n );\n } else {\n printOutput(\n { error: `Unknown strategy '${strategy}'. Supported: best-supply, leverage-loop, auto` },\n getOpts(),\n );\n process.exit(1);\n }\n } catch (err) {\n printOutput({ error: String(err) }, getOpts());\n process.exit(1);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseAbi } from \"viem\";\nimport { Registry, ProtocolCategory, multicallRead } from \"@hypurrquant/defi-core\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { takeSnapshot, saveSnapshot, loadSnapshots, calculatePnL } from \"../portfolio-tracker.js\";\nimport { requireChain, errMsg } from \"../utils.js\";\n\nconst ERC20_ABI = parseAbi([\n \"function balanceOf(address owner) external view returns (uint256)\",\n]);\n\nconst POOL_ABI = parseAbi([\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n]);\n\nfunction decodeU256(data: Hex | null, wordOffset = 0): bigint {\n if (!data || data.length < 2 + (wordOffset + 1) * 64) return 0n;\n const hex = data.slice(2 + wordOffset * 64, 2 + wordOffset * 64 + 64);\n return BigInt(\"0x\" + hex);\n}\n\nexport function registerPortfolio(parent: Command, getOpts: () => OutputMode): void {\n const portfolio = parent\n .command(\"portfolio\")\n .description(\"Aggregate positions across all protocols\");\n\n // Show current positions\n portfolio\n .command(\"show\")\n .description(\"Show current portfolio positions\")\n .option(\"--address <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .action(async (opts: { address?: string }) => {\n\n const mode = getOpts();\n const registry = Registry.loadEmbedded();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n\n let chain;\n try {\n chain = registry.getChain(chainName);\n } catch (e) {\n printOutput({ error: `Chain not found: ${chainName}` }, mode);\n return;\n }\n\n const addr = opts.address ?? process.env[\"DEFI_WALLET_ADDRESS\"];\n if (!addr) { printOutput({ error: \"--address required (or set DEFI_WALLET_ADDRESS)\" }, mode); return; }\n const user = addr as Address;\n if (!/^0x[0-9a-fA-F]{40}$/.test(user)) {\n printOutput({ error: `Invalid address: ${addr}` }, mode);\n return;\n }\n\n const rpc = chain.effectiveRpcUrl();\n const calls: Array<[Address, Hex]> = [];\n const callLabels: string[] = [];\n\n // 1. Token balances\n const tokenSymbols: string[] = (registry.tokens.get(chainName) ?? []).map((t) => t.symbol);\n\n for (const symbol of tokenSymbols) {\n let entry;\n try {\n entry = registry.resolveToken(chainName, symbol);\n } catch {\n continue;\n }\n if (entry.address === (\"0x0000000000000000000000000000000000000000\" as Address)) continue;\n calls.push([\n entry.address as Address,\n encodeFunctionData({ abi: ERC20_ABI, functionName: \"balanceOf\", args: [user] }),\n ]);\n callLabels.push(`balance:${symbol}`);\n }\n\n // 2. Lending positions — aave_v3 pools\n const lendingProtocols = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending && p.interface === \"aave_v3\")\n .filter((p) => p.contracts?.[\"pool\"]);\n\n for (const p of lendingProtocols) {\n calls.push([\n p.contracts![\"pool\"] as Address,\n encodeFunctionData({ abi: POOL_ABI, functionName: \"getUserAccountData\", args: [user] }),\n ]);\n callLabels.push(`lending:${p.name}`);\n }\n\n // 3. Native token price from first available oracle\n const oracleEntry = registry\n .getProtocolsForChain(chainName)\n .find((p) => p.interface === \"aave_v3\" && p.contracts?.[\"oracle\"]);\n const oracleAddr = oracleEntry?.contracts?.[\"oracle\"] as Address | undefined;\n const wrappedNative = (chain.wrapped_native ?? \"0x5555555555555555555555555555555555555555\") as Address;\n\n if (oracleAddr) {\n calls.push([\n oracleAddr,\n encodeFunctionData({ abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [wrappedNative] }),\n ]);\n callLabels.push(\"price:native\");\n }\n\n if (calls.length === 0) {\n printOutput(\n {\n address: user,\n chain: chain.name,\n error: \"No protocols or tokens configured for this chain\",\n },\n mode,\n );\n return;\n }\n\n let results: (Hex | null)[];\n try {\n results = await multicallRead(rpc, calls);\n } catch (e) {\n printOutput({ error: `Multicall failed: ${errMsg(e)}` }, mode);\n return;\n }\n\n // Get native price (last call if oracle present)\n let nativePriceUsd = 0;\n if (oracleAddr) {\n const priceData = results[results.length - 1] ?? null;\n nativePriceUsd = Number(decodeU256(priceData)) / 1e8;\n }\n\n let totalValueUsd = 0;\n let idx = 0;\n const tokenBalances: unknown[] = [];\n\n // Parse token balances\n for (const symbol of tokenSymbols) {\n let entry;\n try {\n entry = registry.resolveToken(chainName, symbol);\n } catch {\n continue;\n }\n if (entry.address === (\"0x0000000000000000000000000000000000000000\" as Address)) continue;\n if (idx >= results.length) break;\n\n const balance = decodeU256(results[idx] ?? null);\n if (balance > 0n) {\n const decimals = entry.decimals;\n const balF64 = Number(balance) / 10 ** decimals;\n const symbolUpper = symbol.toUpperCase();\n const valueUsd =\n symbolUpper.includes(\"USD\") || symbolUpper.includes(\"usd\")\n ? balF64\n : balF64 * nativePriceUsd;\n totalValueUsd += valueUsd;\n tokenBalances.push({\n symbol,\n balance: balF64.toFixed(4),\n value_usd: valueUsd.toFixed(2),\n });\n }\n idx++;\n }\n\n // Parse lending positions\n const lendingPositions: unknown[] = [];\n for (const p of lendingProtocols) {\n if (idx >= results.length) break;\n const data = results[idx] ?? null;\n if (data && data.length >= 2 + 192 * 2) {\n const collateral = Number(decodeU256(data, 0)) / 1e8;\n const debt = Number(decodeU256(data, 1)) / 1e8;\n const hfRaw = decodeU256(data, 5);\n let hf: number | null = null;\n if (hfRaw <= BigInt(\"0xffffffffffffffffffffffffffffffff\")) {\n const v = Number(hfRaw) / 1e18;\n hf = v > 1e10 ? null : v;\n }\n if (collateral > 0 || debt > 0) {\n totalValueUsd += collateral - debt;\n lendingPositions.push({\n protocol: p.name,\n collateral_usd: collateral.toFixed(2),\n debt_usd: debt.toFixed(2),\n health_factor: hf,\n });\n }\n }\n idx++;\n }\n\n printOutput(\n {\n address: user,\n chain: chain.name,\n native_price_usd: nativePriceUsd.toFixed(2),\n total_value_usd: totalValueUsd.toFixed(2),\n token_balances: tokenBalances,\n lending_positions: lendingPositions,\n },\n mode,\n );\n });\n\n // --- Subcommand: snapshot ---\n portfolio\n .command(\"snapshot\")\n .description(\"Take a new portfolio snapshot and save it locally\")\n .option(\"--address <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .action(async (opts: { address?: string }) => {\n const mode = getOpts();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n\n const addr = opts.address ?? process.env[\"DEFI_WALLET_ADDRESS\"];\n if (!addr) { printOutput({ error: \"--address required (or set DEFI_WALLET_ADDRESS)\" }, mode); return; }\n if (!/^0x[0-9a-fA-F]{40}$/.test(addr)) {\n printOutput({ error: `Invalid address: ${addr}` }, mode);\n return;\n }\n\n try {\n const snapshot = await takeSnapshot(chainName, addr, registry);\n const filepath = saveSnapshot(snapshot);\n printOutput(\n {\n saved: filepath,\n timestamp: new Date(snapshot.timestamp).toISOString(),\n chain: snapshot.chain,\n wallet: snapshot.wallet,\n total_value_usd: snapshot.total_value_usd.toFixed(2),\n token_count: snapshot.tokens.length,\n defi_position_count: snapshot.defi_positions.length,\n },\n mode,\n );\n } catch (e) {\n printOutput({ error: errMsg(e) }, mode);\n }\n });\n\n // --- Subcommand: pnl ---\n portfolio\n .command(\"pnl\")\n .description(\"Show PnL since the last snapshot\")\n .option(\"--address <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .option(\"--since <hours>\", \"Compare against snapshot from N hours ago (default: last snapshot)\")\n .action(async (opts: { address?: string; since?: string }) => {\n const mode = getOpts();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n\n const addr = opts.address ?? process.env[\"DEFI_WALLET_ADDRESS\"];\n if (!addr) { printOutput({ error: \"--address required (or set DEFI_WALLET_ADDRESS)\" }, mode); return; }\n if (!/^0x[0-9a-fA-F]{40}$/.test(addr)) {\n printOutput({ error: `Invalid address: ${addr}` }, mode);\n return;\n }\n\n const snapshots = loadSnapshots(chainName, addr, 50);\n if (snapshots.length === 0) {\n printOutput({ error: \"No snapshots found. Run `portfolio snapshot` first.\" }, mode);\n return;\n }\n\n let previous = snapshots[0];\n if (opts.since) {\n const sinceMs = parseFloat(opts.since) * 60 * 60 * 1000;\n const cutoff = Date.now() - sinceMs;\n const match = snapshots.find((s) => s.timestamp <= cutoff);\n if (!match) {\n printOutput({ error: `No snapshot found older than ${opts.since} hours` }, mode);\n return;\n }\n previous = match;\n }\n\n try {\n const current = await takeSnapshot(chainName, addr, registry);\n const pnl = calculatePnL(current, previous);\n printOutput(\n {\n chain: chainName,\n wallet: addr,\n previous_snapshot: new Date(previous.timestamp).toISOString(),\n current_time: new Date(current.timestamp).toISOString(),\n ...pnl,\n pnl_usd: pnl.pnl_usd.toFixed(2),\n pnl_pct: pnl.pnl_pct.toFixed(4),\n start_value_usd: pnl.start_value_usd.toFixed(2),\n end_value_usd: pnl.end_value_usd.toFixed(2),\n },\n mode,\n );\n } catch (e) {\n printOutput({ error: errMsg(e) }, mode);\n }\n });\n\n // --- Subcommand: history ---\n portfolio\n .command(\"history\")\n .description(\"List saved portfolio snapshots with values\")\n .option(\"--address <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .option(\"--limit <n>\", \"Number of snapshots to show\", \"10\")\n .action(async (opts: { address?: string; limit: string }) => {\n const mode = getOpts();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n\n const addr = opts.address ?? process.env[\"DEFI_WALLET_ADDRESS\"];\n if (!addr) { printOutput({ error: \"--address required (or set DEFI_WALLET_ADDRESS)\" }, mode); return; }\n if (!/^0x[0-9a-fA-F]{40}$/.test(addr)) {\n printOutput({ error: `Invalid address: ${addr}` }, mode);\n return;\n }\n\n const limit = parseInt(opts.limit, 10);\n const snapshots = loadSnapshots(chainName, addr, limit);\n\n if (snapshots.length === 0) {\n printOutput({ message: \"No snapshots found for this address on this chain.\" }, mode);\n return;\n }\n\n const history = snapshots.map((s) => ({\n timestamp: new Date(s.timestamp).toISOString(),\n chain: s.chain,\n wallet: s.wallet,\n total_value_usd: s.total_value_usd.toFixed(2),\n token_count: s.tokens.length,\n defi_position_count: s.defi_positions.length,\n }));\n\n printOutput({ snapshots: history }, mode);\n });\n}\n","import { mkdirSync, writeFileSync, readdirSync, readFileSync, existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { resolve } from \"path\";\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseAbi } from \"viem\";\nimport { Registry, ProtocolCategory, multicallRead } from \"@hypurrquant/defi-core\";\nimport type { PortfolioSnapshot, TokenBalance, DefiPosition, PortfolioPnL, TokenChange } from \"@hypurrquant/defi-core\";\n\nconst ERC20_ABI = parseAbi([\n \"function balanceOf(address owner) external view returns (uint256)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n]);\n\nconst POOL_ABI = parseAbi([\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n]);\n\nfunction decodeU256Word(data: Hex | null, wordOffset = 0): bigint {\n if (!data || data.length < 2 + (wordOffset + 1) * 64) return 0n;\n const hex = data.slice(2 + wordOffset * 64, 2 + wordOffset * 64 + 64);\n return BigInt(\"0x\" + hex);\n}\n\nfunction snapshotDir(): string {\n return resolve(homedir(), \".defi-cli\", \"snapshots\");\n}\n\nexport async function takeSnapshot(\n chainName: string,\n wallet: string,\n registry: Registry,\n): Promise<PortfolioSnapshot> {\n const chain = registry.getChain(chainName);\n const user = wallet as Address;\n const rpc = chain.effectiveRpcUrl();\n\n const calls: Array<[Address, Hex]> = [];\n const callLabels: string[] = [];\n\n // 1. Token balances\n const tokenEntries: Array<{ symbol: string; address: Address; decimals: number }> = [];\n for (const t of registry.tokens.get(chainName) ?? []) {\n let entry;\n try {\n entry = registry.resolveToken(chainName, t.symbol);\n } catch {\n continue;\n }\n if (entry.address === (\"0x0000000000000000000000000000000000000000\" as Address)) continue;\n tokenEntries.push({ symbol: t.symbol, address: entry.address as Address, decimals: entry.decimals });\n calls.push([\n entry.address as Address,\n encodeFunctionData({ abi: ERC20_ABI, functionName: \"balanceOf\", args: [user] }),\n ]);\n callLabels.push(`balance:${t.symbol}`);\n }\n\n // 2. Lending positions (aave_v3)\n const lendingProtocols = registry\n .getProtocolsForChain(chainName)\n .filter((p) => p.category === ProtocolCategory.Lending && p.interface === \"aave_v3\")\n .filter((p) => p.contracts?.[\"pool\"]);\n\n for (const p of lendingProtocols) {\n calls.push([\n p.contracts![\"pool\"] as Address,\n encodeFunctionData({ abi: POOL_ABI, functionName: \"getUserAccountData\", args: [user] }),\n ]);\n callLabels.push(`lending:${p.name}`);\n }\n\n // 3. Native price from oracle\n const oracleEntry = registry\n .getProtocolsForChain(chainName)\n .find((p) => p.interface === \"aave_v3\" && p.contracts?.[\"oracle\"]);\n const oracleAddr = oracleEntry?.contracts?.[\"oracle\"] as Address | undefined;\n const wrappedNative = (chain.wrapped_native ?? \"0x5555555555555555555555555555555555555555\") as Address;\n\n if (oracleAddr) {\n calls.push([\n oracleAddr,\n encodeFunctionData({ abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [wrappedNative] }),\n ]);\n callLabels.push(\"price:native\");\n }\n\n let results: (Hex | null)[] = calls.map(() => null);\n if (calls.length > 0) {\n results = await multicallRead(rpc, calls);\n }\n\n // Native price\n let nativePriceUsd = 0;\n if (oracleAddr) {\n const priceData = results[results.length - 1] ?? null;\n nativePriceUsd = Number(decodeU256Word(priceData)) / 1e8;\n }\n\n let idx = 0;\n const tokens: TokenBalance[] = [];\n let totalValueUsd = 0;\n\n // Parse token balances\n for (const entry of tokenEntries) {\n if (idx >= results.length) break;\n const balance = decodeU256Word(results[idx] ?? null);\n const balF64 = Number(balance) / 10 ** entry.decimals;\n const symbolUpper = entry.symbol.toUpperCase();\n const priceUsd =\n symbolUpper.includes(\"USD\") ? 1 : nativePriceUsd;\n const valueUsd = balF64 * priceUsd;\n totalValueUsd += valueUsd;\n tokens.push({\n token: entry.address,\n symbol: entry.symbol,\n balance,\n value_usd: valueUsd,\n price_usd: priceUsd,\n });\n idx++;\n }\n\n // Parse lending positions\n const defiPositions: DefiPosition[] = [];\n for (const p of lendingProtocols) {\n if (idx >= results.length) break;\n const data = results[idx] ?? null;\n if (data && data.length >= 2 + 192 * 2) {\n const collateral = Number(decodeU256Word(data, 0)) / 1e8;\n const debt = Number(decodeU256Word(data, 1)) / 1e8;\n if (collateral > 0) {\n totalValueUsd += collateral;\n defiPositions.push({\n protocol: p.name,\n type: \"lending_supply\",\n asset: \"collateral\",\n amount: BigInt(Math.round(collateral * 1e8)),\n value_usd: collateral,\n });\n }\n if (debt > 0) {\n totalValueUsd -= debt;\n defiPositions.push({\n protocol: p.name,\n type: \"lending_borrow\",\n asset: \"debt\",\n amount: BigInt(Math.round(debt * 1e8)),\n value_usd: debt,\n });\n }\n }\n idx++;\n }\n\n return {\n timestamp: Date.now(),\n chain: chainName,\n wallet,\n tokens,\n defi_positions: defiPositions,\n total_value_usd: totalValueUsd,\n };\n}\n\nexport function saveSnapshot(snapshot: PortfolioSnapshot): string {\n const dir = snapshotDir();\n mkdirSync(dir, { recursive: true });\n const filename = `${snapshot.chain}_${snapshot.wallet}_${snapshot.timestamp}.json`;\n const filepath = resolve(dir, filename);\n writeFileSync(filepath, JSON.stringify(snapshot, (_k, v) => (typeof v === \"bigint\" ? v.toString() : v), 2));\n return filepath;\n}\n\nexport function loadSnapshots(chain: string, wallet: string, limit = 10): PortfolioSnapshot[] {\n const dir = snapshotDir();\n if (!existsSync(dir)) return [];\n\n const prefix = `${chain}_${wallet}_`;\n const files = readdirSync(dir)\n .filter((f) => f.startsWith(prefix) && f.endsWith(\".json\"))\n .sort()\n .reverse()\n .slice(0, limit);\n\n return files.map((f) => {\n const raw = JSON.parse(readFileSync(resolve(dir, f), \"utf-8\"));\n // Restore bigint fields\n if (Array.isArray(raw.tokens)) {\n for (const t of raw.tokens) {\n if (typeof t.balance === \"string\") t.balance = BigInt(t.balance);\n }\n }\n if (Array.isArray(raw.defi_positions)) {\n for (const p of raw.defi_positions) {\n if (typeof p.amount === \"string\") p.amount = BigInt(p.amount);\n }\n }\n return raw as PortfolioSnapshot;\n });\n}\n\nexport function calculatePnL(current: PortfolioSnapshot, previous: PortfolioSnapshot): PortfolioPnL {\n const startValue = previous.total_value_usd;\n const endValue = current.total_value_usd;\n const pnlUsd = endValue - startValue;\n const pnlPct = startValue !== 0 ? (pnlUsd / startValue) * 100 : 0;\n\n const prevTokenMap = new Map<string, TokenBalance>();\n for (const t of previous.tokens) {\n prevTokenMap.set(t.symbol, t);\n }\n\n const tokenChanges: TokenChange[] = [];\n for (const t of current.tokens) {\n const prev = prevTokenMap.get(t.symbol);\n const prevBalance = prev?.balance ?? 0n;\n const prevValueUsd = prev?.value_usd ?? 0;\n const balanceChange = t.balance - prevBalance;\n const valueChangeUsd = t.value_usd - prevValueUsd;\n if (balanceChange !== 0n || Math.abs(valueChangeUsd) > 0.001) {\n tokenChanges.push({\n symbol: t.symbol,\n balance_change: balanceChange,\n value_change_usd: valueChangeUsd,\n });\n }\n }\n\n const durationMs = current.timestamp - previous.timestamp;\n const durationHours = durationMs / (1000 * 60 * 60);\n const period =\n durationHours < 1\n ? `${Math.round(durationMs / 60000)}m`\n : durationHours < 24\n ? `${durationHours.toFixed(1)}h`\n : `${(durationHours / 24).toFixed(1)}d`;\n\n return {\n period,\n start_value_usd: startValue,\n end_value_usd: endValue,\n pnl_usd: pnlUsd,\n pnl_pct: pnlPct,\n token_changes: tokenChanges,\n };\n}\n","import type { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { Registry, ProtocolCategory } from \"@hypurrquant/defi-core\";\nimport { createOracleFromLending, createOracleFromCdp, createDex, DexSpotPrice } from \"@hypurrquant/defi-protocols\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { requireChain } from \"../utils.js\";\n\ninterface PriceEntry {\n source: string;\n source_type: string;\n price: number;\n}\n\ninterface PriceReport {\n asset: string;\n asset_address: string;\n prices: PriceEntry[];\n max_spread_pct: number;\n oracle_vs_dex_spread_pct: number;\n}\n\nfunction round2(x: number): number {\n return Math.round(x * 100) / 100;\n}\n\nfunction resolveAsset(\n registry: Registry,\n chain: string,\n asset: string,\n): { address: Address; symbol: string; decimals: number } {\n // Try parse as address\n if (/^0x[0-9a-fA-F]{40}$/.test(asset)) {\n return { address: asset as Address, symbol: asset, decimals: 18 };\n }\n const token = registry.resolveToken(chain, asset);\n return { address: token.address, symbol: token.symbol, decimals: token.decimals };\n}\n\nconst WHYPE_ADDRESS = \"0x5555555555555555555555555555555555555555\" as Address;\n\nexport function registerPrice(parent: Command, getOpts: () => OutputMode): void {\n parent\n .command(\"price\")\n .description(\"Query asset prices from oracles and DEXes\")\n .requiredOption(\"--asset <token>\", \"Token symbol or address\")\n .option(\"--source <source>\", \"Price source: oracle, dex, or all\", \"all\")\n .action(async (opts: { asset: string; source: string }) => {\n const mode = getOpts();\n const registry = Registry.loadEmbedded();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n\n let chain;\n try {\n chain = registry.getChain(chainName);\n } catch (e) {\n printOutput({ error: `Chain not found: ${chainName}` }, mode);\n return;\n }\n\n const rpcUrl = chain.effectiveRpcUrl();\n\n let assetAddr: Address;\n let assetSymbol: string;\n let assetDecimals: number;\n try {\n const resolved = resolveAsset(registry, chainName, opts.asset);\n assetAddr = resolved.address;\n assetSymbol = resolved.symbol;\n assetDecimals = resolved.decimals;\n } catch (e) {\n printOutput({ error: `Could not resolve asset: ${opts.asset}` }, mode);\n return;\n }\n\n const fetchOracle = opts.source === \"all\" || opts.source === \"oracle\";\n const fetchDex = opts.source === \"all\" || opts.source === \"dex\";\n\n const allPrices: Array<{ source: string; source_type: string; price_f64: number }> = [];\n\n // Oracle prices from lending protocols (Aave V3 forks)\n if (fetchOracle) {\n const lendingProtocols = registry.getProtocolsByCategory(ProtocolCategory.Lending)\n .filter((p) => p.chain.toLowerCase() === chainName);\n\n await Promise.all(\n lendingProtocols.map(async (entry) => {\n try {\n const oracle = createOracleFromLending(entry, rpcUrl);\n const price = await oracle.getPrice(assetAddr);\n allPrices.push({\n source: price.source,\n source_type: price.source_type,\n price_f64: price.price_f64,\n });\n } catch {\n // Interface doesn't support oracle — skip\n }\n }),\n );\n\n // Oracle prices from CDP protocols (Felix) — only for WHYPE\n const isWhype =\n assetAddr.toLowerCase() === WHYPE_ADDRESS.toLowerCase() ||\n assetSymbol.toUpperCase() === \"WHYPE\" ||\n assetSymbol.toUpperCase() === \"HYPE\";\n\n if (isWhype) {\n const cdpProtocols = registry.getProtocolsByCategory(ProtocolCategory.Cdp)\n .filter((p) => p.chain.toLowerCase() === chainName);\n\n await Promise.all(\n cdpProtocols.map(async (entry) => {\n try {\n const oracle = createOracleFromCdp(entry, assetAddr, rpcUrl);\n const price = await oracle.getPrice(assetAddr);\n allPrices.push({\n source: price.source,\n source_type: price.source_type,\n price_f64: price.price_f64,\n });\n } catch {\n // skip\n }\n }),\n );\n }\n }\n\n // DEX spot prices\n if (fetchDex) {\n let usdcToken;\n try {\n usdcToken = registry.resolveToken(chainName, \"USDC\");\n } catch {\n process.stderr.write(\"USDC token not found in registry — skipping DEX prices\\n\");\n }\n\n if (usdcToken) {\n const dexProtocols = registry.getProtocolsByCategory(ProtocolCategory.Dex)\n .filter((p) => p.chain.toLowerCase() === chainName);\n\n await Promise.all(\n dexProtocols.map(async (entry) => {\n try {\n const dex = createDex(entry, rpcUrl);\n const price = await DexSpotPrice.getPrice(\n dex,\n assetAddr,\n assetDecimals,\n usdcToken!.address,\n usdcToken!.decimals,\n );\n allPrices.push({\n source: price.source,\n source_type: price.source_type,\n price_f64: price.price_f64,\n });\n } catch {\n // skip\n }\n }),\n );\n }\n }\n\n if (allPrices.length === 0) {\n printOutput({ error: \"No prices could be fetched from any source\" }, mode);\n return;\n }\n\n const pricesF64 = allPrices.map((p) => p.price_f64);\n const maxPrice = Math.max(...pricesF64);\n const minPrice = Math.min(...pricesF64);\n const maxSpreadPct = minPrice > 0 ? ((maxPrice - minPrice) / minPrice) * 100 : 0;\n\n const oraclePrices = allPrices.filter((p) => p.source_type === \"oracle\").map((p) => p.price_f64);\n const dexPrices = allPrices.filter((p) => p.source_type === \"dex_spot\").map((p) => p.price_f64);\n\n let oracleVsDexSpreadPct = 0;\n if (oraclePrices.length > 0 && dexPrices.length > 0) {\n const avgOracle = oraclePrices.reduce((a, b) => a + b, 0) / oraclePrices.length;\n const avgDex = dexPrices.reduce((a, b) => a + b, 0) / dexPrices.length;\n const minAvg = Math.min(avgOracle, avgDex);\n oracleVsDexSpreadPct = minAvg > 0 ? (Math.abs(avgOracle - avgDex) / minAvg) * 100 : 0;\n }\n\n const report: PriceReport = {\n asset: assetSymbol,\n asset_address: assetAddr,\n prices: allPrices.map((p) => ({\n source: p.source,\n source_type: p.source_type,\n price: round2(p.price_f64),\n })),\n max_spread_pct: round2(maxSpreadPct),\n oracle_vs_dex_spread_pct: round2(oracleVsDexSpreadPct),\n };\n\n printOutput(report, mode);\n });\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport { createPublicClient, http, formatEther } from \"viem\";\nimport { requireChain } from \"../utils.js\";\n\nexport function registerWallet(parent: Command, getOpts: () => OutputMode): void {\n const wallet = parent.command(\"wallet\").description(\"Wallet management\");\n\n wallet\n .command(\"balance\")\n .description(\"Show native token balance\")\n .option(\"--address <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .action(async (opts) => {\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const addr = opts.address ?? process.env[\"DEFI_WALLET_ADDRESS\"];\n if (!addr) { printOutput({ error: \"--address required (or set DEFI_WALLET_ADDRESS)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const client = createPublicClient({ transport: http(chain.effectiveRpcUrl()) });\n\n const balance = await client.getBalance({ address: addr as `0x${string}` });\n printOutput({\n chain: chain.name,\n address: addr,\n native_token: chain.native_token,\n balance_wei: balance,\n balance_formatted: formatEther(balance),\n }, getOpts());\n });\n\n wallet\n .command(\"address\")\n .description(\"Show configured wallet address\")\n .action(async () => {\n const addr = process.env.DEFI_WALLET_ADDRESS ?? \"(not set)\";\n printOutput({ address: addr }, getOpts());\n });\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport type { Executor } from \"../executor.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry, buildApprove, buildTransfer, erc20Abi } from \"@hypurrquant/defi-core\";\nimport { createPublicClient, http, maxUint256 } from \"viem\";\nimport type { Address } from \"viem\";\nimport { requireChain, resolveTokenAddress } from \"../utils.js\";\n\nexport function registerToken(parent: Command, getOpts: () => OutputMode, makeExecutor: () => Executor): void {\n const token = parent.command(\"token\").description(\"Token operations: approve, allowance, transfer, balance\");\n\n token\n .command(\"balance\")\n .description(\"Query token balance for an address\")\n .requiredOption(\"--token <token>\", \"Token symbol or address\")\n .option(\"--owner <address>\", \"Wallet address (defaults to DEFI_WALLET_ADDRESS)\")\n .action(async (opts) => {\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const owner = opts.owner ?? process.env[\"DEFI_WALLET_ADDRESS\"];\n if (!owner) { printOutput({ error: \"--owner required (or set DEFI_WALLET_ADDRESS)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const client = createPublicClient({ transport: http(chain.effectiveRpcUrl()) });\n\n const tokenAddr = resolveTokenAddress(registry, chainName, opts.token) as Address;\n\n const [balance, symbol, decimals] = await Promise.all([\n client.readContract({ address: tokenAddr, abi: erc20Abi, functionName: \"balanceOf\", args: [owner as Address] }),\n client.readContract({ address: tokenAddr, abi: erc20Abi, functionName: \"symbol\" }),\n client.readContract({ address: tokenAddr, abi: erc20Abi, functionName: \"decimals\" }),\n ]);\n\n printOutput({\n token: tokenAddr,\n symbol,\n owner,\n balance,\n decimals,\n }, getOpts());\n });\n\n token\n .command(\"approve\")\n .description(\"Approve a spender for a token\")\n .requiredOption(\"--token <token>\", \"Token symbol or address\")\n .requiredOption(\"--spender <address>\", \"Spender address\")\n .option(\"--amount <amount>\", \"Amount to approve (use 'max' for unlimited)\", \"max\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const tokenAddr = resolveTokenAddress(registry, chainName, opts.token) as Address;\n\n const amount = opts.amount === \"max\" ? maxUint256 : BigInt(opts.amount);\n const tx = buildApprove(tokenAddr, opts.spender as Address, amount);\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n\n token\n .command(\"allowance\")\n .description(\"Check token allowance\")\n .requiredOption(\"--token <token>\", \"Token symbol or address\")\n .option(\"--owner <address>\", \"Owner address (defaults to DEFI_WALLET_ADDRESS)\")\n .requiredOption(\"--spender <address>\", \"Spender address\")\n .action(async (opts) => {\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const owner = opts.owner ?? process.env[\"DEFI_WALLET_ADDRESS\"];\n if (!owner) { printOutput({ error: \"--owner required (or set DEFI_WALLET_ADDRESS)\" }, getOpts()); return; }\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const client = createPublicClient({ transport: http(chain.effectiveRpcUrl()) });\n\n const tokenAddr = resolveTokenAddress(registry, chainName, opts.token) as Address;\n\n const allowance = await client.readContract({\n address: tokenAddr, abi: erc20Abi, functionName: \"allowance\",\n args: [owner as Address, opts.spender as Address],\n });\n\n printOutput({ token: tokenAddr, owner, spender: opts.spender, allowance }, getOpts());\n });\n\n token\n .command(\"transfer\")\n .description(\"Transfer tokens to an address\")\n .requiredOption(\"--token <token>\", \"Token symbol or address\")\n .requiredOption(\"--to <address>\", \"Recipient address\")\n .requiredOption(\"--amount <amount>\", \"Amount to transfer (in wei)\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const tokenAddr = resolveTokenAddress(registry, chainName, opts.token) as Address;\n\n const tx = buildTransfer(tokenAddr, opts.to as Address, BigInt(opts.amount));\n const result = await executor.execute(tx);\n printOutput(result, getOpts());\n });\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\nimport { requireChain, resolveWallet, errMsg } from \"../utils.js\";\n\nconst LIFI_API = \"https://li.quest/v1\";\nconst DLN_API = \"https://dln.debridge.finance/v1.0/dln/order\";\nconst CCTP_FEE_API = \"https://iris-api.circle.com/v2/burn/USDC/fees\";\n\n// Bridge destinations beyond the source-chain registry.\n// These chains are not registered for source operations (lending/LP/swap) but\n// are valid CCTP/LI.FI/deBridge destinations.\nconst DEST_CHAIN_META: Record<string, { chain_id: number; name: string }> = {\n ethereum: { chain_id: 1, name: \"Ethereum\" },\n optimism: { chain_id: 10, name: \"Optimism\" },\n polygon: { chain_id: 137, name: \"Polygon\" },\n arbitrum: { chain_id: 42161, name: \"Arbitrum\" },\n avalanche: { chain_id: 43114, name: \"Avalanche\" },\n linea: { chain_id: 59144, name: \"Linea\" },\n zksync: { chain_id: 324, name: \"zkSync\" },\n};\n\nfunction resolveDestChain(registry: Registry, slug: string): { chain_id: number; name: string } {\n try {\n const c = registry.getChain(slug);\n return { chain_id: c.chain_id, name: c.name };\n } catch {\n const meta = DEST_CHAIN_META[slug];\n if (!meta) {\n throw new Error(\n `Unknown destination chain '${slug}'. Source chains: hyperevm, mantle, base, bnb, monad. ` +\n `Bridge destinations also include: ${Object.keys(DEST_CHAIN_META).join(\", \")}.`,\n );\n }\n return meta;\n }\n}\n\n// ── deBridge DLN ──\n\nconst DLN_CHAIN_IDS: Record<string, number> = {\n ethereum: 1,\n optimism: 10,\n bnb: 56,\n polygon: 137,\n arbitrum: 42161,\n avalanche: 43114,\n base: 8453,\n linea: 59144,\n zksync: 324,\n};\n\nasync function getDebridgeQuote(\n srcChainId: number,\n dstChainId: number,\n srcToken: string,\n dstToken: string,\n amountRaw: string,\n recipient: string,\n): Promise<{ amountOut: string; estimatedTime: number; raw: unknown }> {\n const params = new URLSearchParams({\n srcChainId: String(srcChainId),\n srcChainTokenIn: srcToken,\n srcChainTokenInAmount: amountRaw,\n dstChainId: String(dstChainId),\n dstChainTokenOut: dstToken,\n prependOperatingExpenses: \"true\",\n });\n\n const res = await fetch(`${DLN_API}/quote?${params}`);\n if (!res.ok) throw new Error(`deBridge quote failed: ${res.status} ${await res.text()}`);\n const data = await res.json() as Record<string, unknown>;\n\n const estimation = data.estimation as Record<string, unknown>;\n const dstOut = estimation?.dstChainTokenOut as Record<string, unknown>;\n const amountOut = String(dstOut?.recommendedAmount ?? dstOut?.amount ?? \"0\");\n const fulfillDelay = Number((data.order as Record<string, unknown>)?.approximateFulfillmentDelay ?? 10);\n\n // Get create-tx data for the transaction\n const createParams = new URLSearchParams({\n srcChainId: String(srcChainId),\n srcChainTokenIn: srcToken,\n srcChainTokenInAmount: amountRaw,\n dstChainId: String(dstChainId),\n dstChainTokenOut: dstToken,\n dstChainTokenOutAmount: amountOut,\n dstChainTokenOutRecipient: recipient,\n srcChainOrderAuthorityAddress: recipient,\n dstChainOrderAuthorityAddress: recipient,\n prependOperatingExpenses: \"true\",\n });\n\n const createRes = await fetch(`${DLN_API}/create-tx?${createParams}`);\n if (!createRes.ok) throw new Error(`deBridge create-tx failed: ${createRes.status} ${await createRes.text()}`);\n const createData = await createRes.json() as Record<string, unknown>;\n\n return {\n amountOut,\n estimatedTime: fulfillDelay,\n raw: createData,\n };\n}\n\n// ── Circle CCTP ──\n\n// CCTP domains per chain (V2)\nconst CCTP_DOMAINS: Record<string, number> = {\n ethereum: 0,\n avalanche: 1,\n optimism: 2,\n arbitrum: 3,\n solana: 5,\n base: 6,\n polygon: 7,\n sui: 8,\n aptos: 9,\n};\n\n// TokenMessenger V2 contract address (same on all EVM chains)\nconst CCTP_TOKEN_MESSENGER_V2 = \"0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d\";\n\n// Native USDC addresses per chain\nconst CCTP_USDC_ADDRESSES: Record<string, string> = {\n ethereum: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n avalanche: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n optimism: \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n arbitrum: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n base: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n polygon: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n};\n\nasync function getCctpFeeEstimate(\n srcDomain: number,\n dstDomain: number,\n amountUsdc: number,\n): Promise<{ fee: number; maxFeeSubunits: bigint }> {\n try {\n const res = await fetch(`${CCTP_FEE_API}/${srcDomain}/${dstDomain}`);\n if (res.ok) {\n const schedules = await res.json() as Array<{\n finalityThreshold: number;\n minimumFee: number;\n forwardFee?: { low: number; med: number; high: number };\n }>;\n // Use standard finality (2000) schedule\n const schedule = schedules.find(s => s.finalityThreshold === 2000) ?? schedules[0];\n if (schedule) {\n const amountSubunits = BigInt(Math.round(amountUsdc * 1e6));\n const bpsRounded = BigInt(Math.round(schedule.minimumFee * 100));\n const protocolFee = (amountSubunits * bpsRounded) / 1_000_000n;\n const protocolFeeBuffered = (protocolFee * 120n) / 100n;\n\n if (schedule.forwardFee) {\n const forwardFeeSubunits = BigInt(schedule.forwardFee.high);\n const totalMaxFee = protocolFeeBuffered + forwardFeeSubunits;\n return { fee: Number(totalMaxFee) / 1e6, maxFeeSubunits: totalMaxFee };\n }\n\n const minFee = protocolFeeBuffered > 0n ? protocolFeeBuffered : 10000n;\n return { fee: Number(minFee) / 1e6, maxFeeSubunits: minFee };\n }\n }\n } catch {\n // use fallback\n }\n return { fee: 0.25, maxFeeSubunits: 250000n };\n}\n\nexport function registerBridge(parent: Command, getOpts: () => OutputMode): void {\n parent\n .command(\"bridge\")\n .description(\"Cross-chain bridge: move assets between chains\")\n .requiredOption(\"--token <token>\", \"Token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount in wei\")\n .requiredOption(\"--to-chain <chain>\", \"Destination chain name\")\n .option(\"--recipient <address>\", \"Recipient address on destination chain\")\n .option(\"--slippage <bps>\", \"Slippage in bps (LI.FI only)\", \"50\")\n .option(\"--provider <name>\", \"Bridge provider: lifi, debridge, cctp\", \"lifi\")\n .action(async (opts) => {\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const fromChain = registry.getChain(chainName);\n let toChain: { chain_id: number; name: string };\n try {\n toChain = resolveDestChain(registry, opts.toChain);\n } catch (e) {\n printOutput({ error: errMsg(e) }, getOpts());\n return;\n }\n const tokenAddr = opts.token.startsWith(\"0x\") ? opts.token : registry.resolveToken(chainName, opts.token).address;\n const recipient = resolveWallet(opts.recipient);\n const provider = (opts.provider as string).toLowerCase();\n\n if (provider === \"debridge\") {\n try {\n const srcId = DLN_CHAIN_IDS[chainName] ?? fromChain.chain_id;\n const dstId = DLN_CHAIN_IDS[opts.toChain] ?? toChain.chain_id;\n\n const result = await getDebridgeQuote(\n srcId, dstId,\n tokenAddr, tokenAddr,\n opts.amount,\n recipient,\n );\n\n const tx = (result.raw as Record<string, unknown>).tx as Record<string, unknown> | undefined;\n printOutput({\n from_chain: fromChain.name, to_chain: toChain.name,\n token: tokenAddr, amount: opts.amount,\n bridge: \"deBridge DLN\",\n estimated_output: result.amountOut,\n estimated_time_seconds: result.estimatedTime,\n tx: tx ? { to: tx.to, data: tx.data, value: tx.value } : undefined,\n }, getOpts());\n } catch (e) {\n printOutput({ error: `deBridge API error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n if (provider === \"cctp\") {\n try {\n const srcDomain = CCTP_DOMAINS[chainName];\n const dstDomain = CCTP_DOMAINS[opts.toChain];\n\n if (srcDomain === undefined) {\n printOutput({ error: `CCTP not supported on source chain: ${chainName}. Supported: ${Object.keys(CCTP_DOMAINS).join(\", \")}` }, getOpts());\n return;\n }\n if (dstDomain === undefined) {\n printOutput({ error: `CCTP not supported on destination chain: ${opts.toChain}. Supported: ${Object.keys(CCTP_DOMAINS).join(\", \")}` }, getOpts());\n return;\n }\n\n const usdcSrc = CCTP_USDC_ADDRESSES[chainName];\n const usdcDst = CCTP_USDC_ADDRESSES[opts.toChain];\n if (!usdcSrc) {\n printOutput({ error: `No native USDC address known for ${chainName}. CCTP requires native USDC.` }, getOpts());\n return;\n }\n\n const amountUsdc = Number(BigInt(opts.amount)) / 1e6;\n const { fee, maxFeeSubunits } = await getCctpFeeEstimate(srcDomain, dstDomain, amountUsdc);\n\n // Build depositForBurn call data\n // TokenMessenger V2: depositForBurn(amount, destinationDomain, mintRecipient, burnToken, maxFee, minFinalityThreshold)\n // mintRecipient must be 32 bytes (left-padded address)\n const recipientPadded = `0x${\"0\".repeat(24)}${recipient.replace(\"0x\", \"\").toLowerCase()}` as `0x${string}`;\n\n const { encodeFunctionData, parseAbi } = await import(\"viem\");\n const tokenMessengerAbi = parseAbi([\n \"function depositForBurn(uint256 amount, uint32 destinationDomain, bytes32 mintRecipient, address burnToken, bytes32 destinationCaller, uint256 maxFee, uint32 minFinalityThreshold) external returns (uint64 nonce)\",\n ]);\n\n const data = encodeFunctionData({\n abi: tokenMessengerAbi,\n functionName: \"depositForBurn\",\n args: [\n BigInt(opts.amount),\n dstDomain,\n recipientPadded as `0x${string}`,\n usdcSrc as Address,\n `0x${\"0\".repeat(64)}` as `0x${string}`, // any caller\n maxFeeSubunits,\n 2000, // standard finality\n ],\n });\n\n printOutput({\n from_chain: fromChain.name, to_chain: toChain.name,\n token: usdcSrc,\n token_dst: usdcDst ?? tokenAddr,\n amount: opts.amount,\n bridge: \"Circle CCTP V2\",\n estimated_fee_usdc: fee,\n estimated_output: String(BigInt(opts.amount) - maxFeeSubunits),\n note: \"After burn, poll https://iris-api.circle.com/v2/messages/{srcDomain} for attestation, then call MessageTransmitter.receiveMessage() on destination\",\n tx: {\n to: CCTP_TOKEN_MESSENGER_V2,\n data,\n value: \"0x0\",\n },\n }, getOpts());\n } catch (e) {\n printOutput({ error: `CCTP error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n // Default: LI.FI\n try {\n const params = new URLSearchParams({\n fromChain: String(fromChain.chain_id), toChain: String(toChain.chain_id),\n fromToken: tokenAddr, toToken: tokenAddr,\n fromAmount: opts.amount, fromAddress: recipient,\n slippage: String(parseInt(opts.slippage) / 10000),\n });\n const res = await fetch(`${LIFI_API}/quote?${params}`);\n const quote = await res.json() as any;\n\n if (quote.transactionRequest) {\n printOutput({\n from_chain: fromChain.name, to_chain: toChain.name,\n token: tokenAddr, amount: opts.amount,\n bridge: quote.toolDetails?.name ?? \"LI.FI\",\n estimated_output: quote.estimate?.toAmount,\n tx: { to: quote.transactionRequest.to, data: quote.transactionRequest.data, value: quote.transactionRequest.value },\n }, getOpts());\n } else {\n printOutput({ error: \"No LI.FI route found\", details: quote }, getOpts());\n }\n } catch (e) {\n printOutput({ error: `LI.FI API error: ${errMsg(e)}` }, getOpts());\n }\n });\n}\n","import type { Command } from \"commander\";\nimport type { OutputMode } from \"../output.js\";\nimport type { Executor } from \"../executor.js\";\nimport { printOutput } from \"../output.js\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\nimport { requireChain, resolveTokenAddress, resolveWallet, errMsg, parseBigIntValue } from \"../utils.js\";\n\n// ── Chain name mappings ──\n\n// Aggregator chain slugs are now defined in chains.toml under `[chain.X.aggregators]`\n// and surfaced via ChainConfig.aggregators. This function preserves the legacy lookup\n// shape so the existing call sites stay readable.\nfunction getAggregatorSlugs(chainCfg: { aggregators?: { kyber?: string; openocean?: string; liquid?: string } }): { kyber?: string; openocean?: string; liquid?: string } {\n return chainCfg.aggregators ?? {};\n}\n\n// ── KyberSwap ──\n\nconst KYBER_API = \"https://aggregator-api.kyberswap.com\";\n\nasync function kyberGetQuote(\n chain: string,\n tokenIn: string,\n tokenOut: string,\n amountIn: string,\n): Promise<Record<string, unknown>> {\n const params = new URLSearchParams({ tokenIn, tokenOut, amountIn });\n const url = `${KYBER_API}/${chain}/api/v1/routes?${params}`;\n const res = await fetch(url, { headers: { \"x-client-id\": \"defi-cli\" } });\n if (!res.ok) throw new Error(`KyberSwap quote failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const data = json.data as Record<string, unknown> | undefined;\n if (!data?.routeSummary) throw new Error(`KyberSwap: no route found`);\n return data;\n}\n\nasync function kyberBuildTx(\n chain: string,\n routeSummary: unknown,\n sender: string,\n recipient: string,\n slippageTolerance: number,\n): Promise<{ to: string; data: string; value: string }> {\n const url = `${KYBER_API}/${chain}/api/v1/route/build`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"x-client-id\": \"defi-cli\" },\n body: JSON.stringify({ routeSummary, sender, recipient, slippageTolerance }),\n });\n if (!res.ok) throw new Error(`KyberSwap build failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const data = json.data as Record<string, unknown> | undefined;\n if (!data) throw new Error(\"KyberSwap: no build data\");\n return {\n to: String(data.routerAddress),\n data: String(data.data),\n value: String(data.value ?? \"0x0\"),\n };\n}\n\n// ── OpenOcean ──\n\nconst OPENOCEAN_API = \"https://open-api.openocean.finance/v4\";\n\nasync function openoceanSwap(\n chain: string,\n inTokenAddress: string,\n outTokenAddress: string,\n amountIn: string,\n slippagePct: string,\n account: string,\n): Promise<{ to: string; data: string; value: string; outAmount: string }> {\n const params = new URLSearchParams({\n inTokenAddress,\n outTokenAddress,\n amount: amountIn,\n gasPrice: \"0.1\",\n slippage: slippagePct,\n account,\n });\n const url = `${OPENOCEAN_API}/${chain}/swap?${params}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`OpenOcean swap failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const data = json.data as Record<string, unknown> | undefined;\n if (!data) throw new Error(\"OpenOcean: no swap data\");\n return {\n to: String(data.to),\n data: String(data.data),\n value: String(data.value ?? \"0x0\"),\n outAmount: String(data.outAmount ?? \"0\"),\n };\n}\n\n// ── LI.FI (multi-chain via chainId) ──\n//\n// API: GET https://li.quest/v1/quote — single same-chain swap or cross-chain bridge.\n// Supports most EVM chains (1, 42161, 8453, 56, 5000, …) via numeric chainId.\nconst LIFI_API = \"https://li.quest/v1\";\n\nasync function lifiQuote(\n chainId: number,\n fromToken: string,\n toToken: string,\n fromAmount: string,\n fromAddress: string,\n slippagePct: string,\n): Promise<{ to: string; data: string; value: string; outAmount: string }> {\n const params = new URLSearchParams({\n fromChain: String(chainId),\n toChain: String(chainId),\n fromToken,\n toToken,\n fromAmount,\n fromAddress,\n slippage: (Number(slippagePct) / 100).toFixed(4),\n });\n const url = `${LIFI_API}/quote?${params}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`LI.FI quote failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const txReq = json.transactionRequest as Record<string, unknown> | undefined;\n if (!txReq) throw new Error(\"LI.FI: no transactionRequest in response\");\n const estimate = json.estimate as Record<string, unknown> | undefined;\n return {\n to: String(txReq.to),\n data: String(txReq.data),\n value: String(txReq.value ?? \"0x0\"),\n outAmount: String(estimate?.toAmount ?? \"0\"),\n };\n}\n\n// ── Relay (multi-chain via chainId) ──\n//\n// API: POST https://api.relay.link/quote — single-chain swap or cross-chain.\n// Returns a multi-step plan; we always execute the first item (same-chain swap = single step).\nconst RELAY_API = \"https://api.relay.link\";\n\nasync function relayQuote(\n chainId: number,\n fromToken: string,\n toToken: string,\n amount: string,\n user: string,\n): Promise<{ to: string; data: string; value: string; outAmount: string }> {\n const body = {\n user,\n originChainId: chainId,\n destinationChainId: chainId,\n originCurrency: fromToken,\n destinationCurrency: toToken,\n recipient: user,\n tradeType: \"EXACT_INPUT\",\n amount,\n };\n const res = await fetch(`${RELAY_API}/quote`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new Error(`Relay quote failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const steps = json.steps as Array<Record<string, unknown>> | undefined;\n // Relay returns multiple steps (approve + swap). The executor handles approval via\n // the `approvals` array, so take the swap step (skipping any \"approve\" step).\n const swapStep = steps?.find((s) => s.id !== \"approve\") ?? steps?.[steps.length - 1];\n const items = swapStep?.items as Array<Record<string, unknown>> | undefined;\n const txData = items?.[0]?.data as Record<string, unknown> | undefined;\n if (!txData) throw new Error(\"Relay: no swap step in quote\");\n const details = json.details as Record<string, unknown> | undefined;\n const currencyOut = details?.currencyOut as Record<string, unknown> | undefined;\n return {\n to: String(txData.to),\n data: String(txData.data),\n value: String(txData.value ?? \"0x0\"),\n outAmount: String(currencyOut?.amount ?? \"0\"),\n };\n}\n\n// ── LiquidSwap (HyperEVM only) ──\n\nconst LIQD_API = \"https://api.liqd.ag/v2\";\nconst LIQD_ROUTER = \"0x744489ee3d540777a66f2cf297479745e0852f7a\";\n\nasync function liquidSwapRoute(\n tokenIn: string,\n tokenOut: string,\n amountIn: string,\n slippagePct: string,\n): Promise<{ to: string; data: string; value: string; outAmount: string }> {\n const params = new URLSearchParams({ tokenIn, tokenOut, amountIn, slippage: slippagePct });\n const url = `${LIQD_API}/route?${params}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`LiquidSwap route failed: ${res.status} ${await res.text()}`);\n const json = await res.json() as Record<string, unknown>;\n const execution = json.execution as Record<string, unknown> | undefined;\n if (!execution) throw new Error(\"LiquidSwap: no execution data in response\");\n const details = json.details as Record<string, unknown> | undefined;\n return {\n to: String(execution.to ?? LIQD_ROUTER),\n data: String(execution.calldata),\n value: String(execution.value ?? \"0x0\"),\n outAmount: String(details?.amountOut ?? json.amountOut ?? \"0\"),\n };\n}\n\n// ── Command registration ──\n\nexport function registerSwap(\n parent: Command,\n getOpts: () => OutputMode,\n makeExecutor: () => Executor,\n): void {\n parent\n .command(\"swap\")\n .description(\"Swap tokens via DEX aggregator (KyberSwap, OpenOcean, LiquidSwap, LI.FI, Relay)\")\n .requiredOption(\"--from <token>\", \"Input token symbol or address\")\n .requiredOption(\"--to <token>\", \"Output token symbol or address\")\n .requiredOption(\"--amount <amount>\", \"Amount of input token in wei\")\n .option(\"--provider <name>\", \"Aggregator: kyber, openocean, liquid, lifi, relay\", \"kyber\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps\", \"50\")\n .action(async (opts) => {\n const executor = makeExecutor();\n const chainName = requireChain(parent, getOpts);\n if (!chainName) return;\n const registry = Registry.loadEmbedded();\n const provider = (opts.provider as string).toLowerCase();\n const slippageBps = parseInt(opts.slippage as string, 10);\n\n // Resolve token addresses\n const fromAddr: string = resolveTokenAddress(registry, chainName, opts.from as string);\n const toAddr: string = resolveTokenAddress(registry, chainName, opts.to as string);\n\n const wallet = resolveWallet();\n\n if (provider === \"kyber\") {\n const aggCfg = getAggregatorSlugs(registry.getChain(chainName));\n if (!aggCfg.kyber) {\n const supported = Array.from(registry.chains.keys()).filter((c) => registry.getChain(c).aggregators?.kyber).join(\", \");\n printOutput({ error: `KyberSwap: unsupported chain '${chainName}'. Supported: ${supported || \"(none)\"}` }, getOpts());\n return;\n }\n const kyberChain = aggCfg.kyber;\n\n try {\n const quoteData = await kyberGetQuote(kyberChain, fromAddr, toAddr, opts.amount as string);\n const routeSummary = quoteData.routeSummary as Record<string, unknown>;\n const amountOut = String((routeSummary as Record<string, unknown>).amountOut ?? \"0\");\n\n // Build tx for the executor\n const txData = await kyberBuildTx(\n kyberChain,\n routeSummary,\n wallet,\n wallet,\n slippageBps,\n );\n\n const tx = {\n description: `KyberSwap: swap ${opts.amount} of ${fromAddr} -> ${toAddr}`,\n to: txData.to as Address,\n data: txData.data as `0x${string}`,\n value: parseBigIntValue(txData.value),\n approvals: [{ token: fromAddr as Address, spender: txData.to as Address, amount: BigInt(opts.amount as string) }],\n };\n\n const result = await executor.execute(tx);\n printOutput({\n provider: \"kyber\",\n chain: kyberChain,\n from_token: fromAddr,\n to_token: toAddr,\n amount_in: opts.amount,\n amount_out: amountOut,\n router: txData.to,\n ...result,\n }, getOpts());\n } catch (e) {\n printOutput({ error: `KyberSwap error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n if (provider === \"openocean\") {\n const aggCfg = getAggregatorSlugs(registry.getChain(chainName));\n if (!aggCfg.openocean) {\n const supported = Array.from(registry.chains.keys()).filter((c) => registry.getChain(c).aggregators?.openocean).join(\", \");\n printOutput({ error: `OpenOcean: unsupported chain '${chainName}'. Supported: ${supported || \"(none)\"}` }, getOpts());\n return;\n }\n const ooChain = aggCfg.openocean;\n // OpenOcean amount is human-readable — convert wei to decimal\n const fromToken = (opts.from as string).startsWith(\"0x\")\n ? registry.tokens.get(chainName)?.find(t => t.address.toLowerCase() === (opts.from as string).toLowerCase())\n : registry.tokens.get(chainName)?.find(t => t.symbol.toLowerCase() === (opts.from as string).toLowerCase());\n const fromDecimals = fromToken?.decimals ?? 18;\n const humanAmount = (Number(opts.amount) / 10 ** fromDecimals).toString();\n const slippagePct = (slippageBps / 100).toFixed(2);\n\n try {\n const swap = await openoceanSwap(\n ooChain,\n fromAddr,\n toAddr,\n humanAmount,\n slippagePct,\n wallet,\n );\n\n const tx = {\n description: `OpenOcean: swap ${opts.amount} of ${fromAddr} -> ${toAddr}`,\n to: swap.to as Address,\n data: swap.data as `0x${string}`,\n value: parseBigIntValue(swap.value),\n approvals: [{ token: fromAddr as Address, spender: swap.to as Address, amount: BigInt(opts.amount as string) }],\n };\n\n const result = await executor.execute(tx);\n printOutput({\n provider: \"openocean\",\n chain: ooChain,\n from_token: fromAddr,\n to_token: toAddr,\n amount_in: opts.amount,\n amount_out: swap.outAmount,\n router: swap.to,\n ...result,\n }, getOpts());\n } catch (e) {\n printOutput({ error: `OpenOcean error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n if (provider === \"liquid\") {\n if (chainName !== \"hyperevm\") {\n printOutput({ error: `LiquidSwap only supports hyperevm, got '${chainName}'` }, getOpts());\n return;\n }\n const slippagePct = (slippageBps / 100).toFixed(2);\n\n try {\n const route = await liquidSwapRoute(fromAddr, toAddr, opts.amount as string, slippagePct);\n\n const tx = {\n description: `LiquidSwap: swap ${opts.amount} of ${fromAddr} -> ${toAddr}`,\n to: route.to as Address,\n data: route.data as `0x${string}`,\n value: parseBigIntValue(route.value),\n approvals: [{ token: fromAddr as Address, spender: route.to as Address, amount: BigInt(opts.amount as string) }],\n };\n\n const result = await executor.execute(tx);\n printOutput({\n provider: \"liquid\",\n chain: chainName,\n from_token: fromAddr,\n to_token: toAddr,\n amount_in: opts.amount,\n amount_out: route.outAmount,\n router: route.to,\n ...result,\n }, getOpts());\n } catch (e) {\n printOutput({ error: `LiquidSwap error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n if (provider === \"lifi\" || provider === \"relay\") {\n const chainCfg = registry.getChain(chainName);\n const chainId = chainCfg.chain_id;\n if (!chainId) {\n printOutput({ error: `${provider}: chain '${chainName}' has no chain_id in registry` }, getOpts());\n return;\n }\n const slippagePct = (slippageBps / 100).toFixed(2);\n try {\n const route = provider === \"lifi\"\n ? await lifiQuote(chainId, fromAddr, toAddr, opts.amount as string, wallet, slippagePct)\n : await relayQuote(chainId, fromAddr, toAddr, opts.amount as string, wallet);\n const tx = {\n description: `${provider}: swap ${opts.amount} of ${fromAddr} -> ${toAddr}`,\n to: route.to as Address,\n data: route.data as `0x${string}`,\n value: parseBigIntValue(route.value),\n approvals: [{ token: fromAddr as Address, spender: route.to as Address, amount: BigInt(opts.amount as string) }],\n };\n const result = await executor.execute(tx);\n printOutput({\n provider,\n chain: chainName,\n chain_id: chainId,\n from_token: fromAddr,\n to_token: toAddr,\n amount_in: opts.amount,\n amount_out: route.outAmount,\n router: route.to,\n ...result,\n }, getOpts());\n } catch (e) {\n printOutput({ error: `${provider} error: ${errMsg(e)}` }, getOpts());\n }\n return;\n }\n\n printOutput({ error: `Unknown provider '${opts.provider}'. Choose: kyber, openocean, liquid, lifi, relay` }, getOpts());\n });\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { createInterface } from \"readline\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { resolve } from \"path\";\n\nconst DEFI_DIR = resolve(process.env.HOME || \"~\", \".defi\");\nconst ENV_FILE = resolve(DEFI_DIR, \".env\");\n\n// ── .env helpers ──────────────────────────────────────────────\n\nfunction ensureDefiDir() {\n if (!existsSync(DEFI_DIR)) mkdirSync(DEFI_DIR, { recursive: true, mode: 0o700 });\n}\n\nfunction loadEnvFile(): Record<string, string> {\n if (!existsSync(ENV_FILE)) return {};\n const lines = readFileSync(ENV_FILE, \"utf-8\").split(\"\\n\");\n const env: Record<string, string> = {};\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx > 0) {\n env[trimmed.slice(0, eqIdx)] = trimmed.slice(eqIdx + 1);\n }\n }\n return env;\n}\n\nfunction writeEnvFile(env: Record<string, string>) {\n ensureDefiDir();\n const lines = [\n \"# defi-cli configuration\",\n \"# Generated by 'defi setup' — edit freely\",\n \"\",\n ];\n for (const [key, value] of Object.entries(env)) {\n lines.push(`${key}=${value}`);\n }\n lines.push(\"\");\n writeFileSync(ENV_FILE, lines.join(\"\\n\"), { mode: 0o600 });\n}\n\n// ── Interactive helpers ────────────────────────────────────────\n\nfunction ask(rl: ReturnType<typeof createInterface>, question: string): Promise<string> {\n return new Promise((res) => rl.question(question, (answer) => res(answer.trim())));\n}\n\n// ── Validation helpers ─────────────────────────────────────────\n\nfunction isValidAddress(s: string): boolean {\n return /^0x[0-9a-fA-F]{40}$/.test(s);\n}\n\nfunction isValidPrivateKey(s: string): boolean {\n return /^0x[0-9a-fA-F]{64}$/.test(s);\n}\n\nasync function deriveAddress(privateKey: string): Promise<string | null> {\n try {\n const { privateKeyToAccount } = await import(\"viem/accounts\");\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n return account.address;\n } catch {\n return null;\n }\n}\n\n// ── Command ────────────────────────────────────────────────────\n\nexport function registerSetup(program: Command) {\n program\n .command(\"setup\")\n .alias(\"init\")\n .description(\"Interactive setup wizard — configure wallet & RPC URLs\")\n .action(async () => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n console.log(pc.cyan(pc.bold(\"\\n defi-cli Setup Wizard\\n\")));\n\n // Show current config if it exists\n const existing = loadEnvFile();\n if (Object.keys(existing).length > 0) {\n console.log(pc.white(\" Current configuration:\"));\n for (const [key, value] of Object.entries(existing)) {\n const masked =\n key.toLowerCase().includes(\"key\")\n ? value.slice(0, 6) + \"...\" + value.slice(-4)\n : value;\n console.log(` ${pc.cyan(key.padEnd(24))} ${pc.gray(masked)}`);\n }\n console.log();\n const overwrite = await ask(rl, \" Overwrite existing config? (y/N): \");\n if (overwrite.toLowerCase() !== \"y\" && overwrite.toLowerCase() !== \"yes\") {\n console.log(pc.gray(\"\\n Keeping existing configuration.\\n\"));\n rl.close();\n return;\n }\n console.log();\n }\n\n const newEnv: Record<string, string> = {};\n\n // ── Wallet address / private key ──\n console.log(pc.cyan(pc.bold(\" Wallet\")));\n\n const privateKey = await ask(rl, \" Private key (optional, for --broadcast, 0x...): \");\n if (privateKey) {\n const normalized = privateKey.startsWith(\"0x\") ? privateKey : `0x${privateKey}`;\n if (!isValidPrivateKey(normalized)) {\n console.log(pc.red(\" Invalid private key (must be 0x + 64 hex chars). Skipped.\"));\n } else {\n newEnv.DEFI_PRIVATE_KEY = normalized;\n const derived = await deriveAddress(normalized);\n if (derived) {\n newEnv.DEFI_WALLET_ADDRESS = derived;\n console.log(` ${pc.green(\"OK\")} derived address: ${pc.gray(derived)}`);\n }\n }\n }\n\n if (!newEnv.DEFI_WALLET_ADDRESS) {\n const address = await ask(rl, \" Wallet address (0x...): \");\n if (address) {\n if (!isValidAddress(address)) {\n console.log(pc.yellow(\" Invalid address format. Skipping.\"));\n } else {\n newEnv.DEFI_WALLET_ADDRESS = address;\n console.log(` ${pc.green(\"OK\")} ${pc.gray(address)}`);\n }\n }\n }\n\n // ── RPC URLs ──\n console.log(pc.cyan(pc.bold(\"\\n RPC URLs\")) + pc.gray(\" (press Enter to use public defaults)\"));\n\n const hyperevmRpc = await ask(rl, \" HyperEVM RPC URL: \");\n if (hyperevmRpc) {\n newEnv.HYPEREVM_RPC_URL = hyperevmRpc;\n console.log(` ${pc.green(\"OK\")} HyperEVM RPC set`);\n }\n\n const mantleRpc = await ask(rl, \" Mantle RPC URL: \");\n if (mantleRpc) {\n newEnv.MANTLE_RPC_URL = mantleRpc;\n console.log(` ${pc.green(\"OK\")} Mantle RPC set`);\n }\n\n // Merge with existing non-overwritten keys (keep old keys not touched above)\n const finalEnv = { ...existing, ...newEnv };\n\n // Write .env\n writeEnvFile(finalEnv);\n\n // Summary\n console.log(pc.cyan(pc.bold(\"\\n Setup Complete!\\n\")));\n console.log(` Config: ${pc.gray(ENV_FILE)}`);\n if (finalEnv.DEFI_WALLET_ADDRESS) {\n console.log(` Wallet: ${pc.gray(finalEnv.DEFI_WALLET_ADDRESS)}`);\n }\n if (finalEnv.DEFI_PRIVATE_KEY) {\n console.log(` Key: ${pc.green(\"configured\")}`);\n }\n if (finalEnv.HYPEREVM_RPC_URL) {\n console.log(` HyperEVM RPC: ${pc.gray(finalEnv.HYPEREVM_RPC_URL)}`);\n }\n if (finalEnv.MANTLE_RPC_URL) {\n console.log(` Mantle RPC: ${pc.gray(finalEnv.MANTLE_RPC_URL)}`);\n }\n\n console.log(pc.bold(pc.white(\"\\n Next steps:\")));\n console.log(` ${pc.green(\"defi portfolio\")} view balances & positions`);\n console.log(` ${pc.green(\"defi scan\")} scan for exploits`);\n console.log(` ${pc.green(\"defi dex quote\")} get a swap quote`);\n console.log(` ${pc.green(\"defi --help\")} browse all commands\\n`);\n\n rl.close();\n } catch (err) {\n rl.close();\n throw err;\n }\n });\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport type { OutputMode } from \"../output.js\";\nimport { printOutput } from \"../output.js\";\nimport { loadOws } from \"../signer/ows-loader.js\";\nimport { createPublicClient, http, formatEther } from \"viem\";\nimport { Registry } from \"@hypurrquant/defi-core\";\nimport { errMsg } from \"../utils.js\";\n\n// ── Balance helper (EVM only for defi-cli) ──\n\nasync function getEvmBalance(\n address: string,\n chainName: string,\n): Promise<{ native_token: string; balance: string; balance_wei: string }> {\n const registry = Registry.loadEmbedded();\n const chain = registry.getChain(chainName);\n const client = createPublicClient({ transport: http(chain.effectiveRpcUrl()) });\n const balance = await client.getBalance({ address: address as `0x${string}` });\n return {\n native_token: chain.native_token,\n balance: formatEther(balance),\n balance_wei: balance.toString(),\n };\n}\n\n// ── Table helper (inline, no external dep) ──\n\nfunction makeTable(headers: string[], rows: string[][]): string {\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => stripAnsi(r[i] ?? \"\").length)),\n );\n const sep = widths.map((w) => \"-\".repeat(w + 2)).join(\"+\");\n const fmtRow = (cells: string[]) =>\n cells.map((c, i) => ` ${padEnd(c, widths[i])} `).join(\"|\");\n return [fmtRow(headers.map((h) => pc.bold(h))), sep, ...rows.map(fmtRow)].join(\"\\n\");\n}\n\nfunction stripAnsi(s: string): string {\n // eslint-disable-next-line no-control-regex\n return s.replace(/\\x1B\\[\\d+m/g, \"\");\n}\n\nfunction padEnd(s: string, len: number): string {\n const visible = stripAnsi(s).length;\n return visible >= len ? s : s + \" \".repeat(len - visible);\n}\n\n// ── Register OWS commands ──\n\nexport function registerOws(parent: Command, getOpts: () => OutputMode): void {\n const ows = parent\n .command(\"ows\")\n .description(\"Open Wallet Standard — encrypted vault wallet management\");\n\n // ── create ──\n\n ows\n .command(\"create <name>\")\n .description(\"Create a new OWS wallet (multi-chain)\")\n .option(\"--words <count>\", \"Mnemonic word count (12 or 24)\", \"12\")\n .action(async (name: string, opts: { words: string }) => {\n try {\n const o = loadOws();\n const w = o.createWallet(name, \"\", parseInt(opts.words));\n const mode = getOpts();\n if (mode.json) {\n return printOutput(\n { id: w.id, name: w.name, accounts: w.accounts, createdAt: w.createdAt },\n mode,\n );\n }\n console.log(pc.cyan(pc.bold(\"\\n OWS Wallet Created\\n\")));\n console.log(` Name: ${pc.bold(w.name)}`);\n console.log(` ID: ${pc.gray(w.id)}`);\n console.log();\n for (const acct of w.accounts) {\n const chain = acct.chainId.split(\":\")[0];\n console.log(` ${pc.cyan(chain.padEnd(10))} ${pc.green(acct.address)}`);\n }\n console.log(pc.gray(`\\n Vault: ~/.ows/`));\n console.log(pc.cyan(`\\n Usage: defi --wallet ${name} lp deposit ...\\n`));\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n\n // ── list ──\n\n ows\n .command(\"list\")\n .description(\"List all OWS wallets in the vault\")\n .action(async () => {\n try {\n const o = loadOws();\n const wallets = o.listWallets();\n const mode = getOpts();\n if (mode.json) return printOutput({ wallets }, mode);\n if (wallets.length === 0) {\n console.log(pc.gray(\"\\n No OWS wallets found.\"));\n console.log(pc.gray(` Create one: ${pc.cyan(\"defi ows create <name>\")}\\n`));\n return;\n }\n console.log(pc.cyan(pc.bold(\"\\n OWS Vault Wallets\\n\")));\n const rows = wallets.map(\n (w: {\n name: string;\n id: string;\n accounts: Array<{ chainId: string; address: string }>;\n createdAt: string;\n }) => {\n const evmAddr =\n w.accounts.find((a: { chainId: string }) => a.chainId.startsWith(\"eip155:\"))\n ?.address ?? \"-\";\n const short =\n evmAddr.length > 14\n ? evmAddr.slice(0, 10) + \"...\" + evmAddr.slice(-4)\n : evmAddr;\n return [\n pc.bold(w.name),\n pc.green(short),\n pc.gray(w.createdAt.split(\"T\")[0]),\n ];\n },\n );\n console.log(makeTable([\"Name\", \"EVM Address\", \"Created\"], rows));\n console.log(pc.gray(`\\n Usage: defi --wallet <name> lp deposit ...\\n`));\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n\n // ── address ──\n\n ows\n .command(\"address <name>\")\n .description(\"Show EVM address for an OWS wallet\")\n .action(async (name: string) => {\n try {\n const o = loadOws();\n const w = o.getWallet(name);\n const evmAccount = w.accounts.find(\n (a: { chainId: string }) => a.chainId.startsWith(\"eip155:\"),\n );\n if (!evmAccount) throw new Error(`OWS wallet \"${name}\" has no EVM account`);\n const mode = getOpts();\n if (mode.json) return printOutput({ wallet: name, address: evmAccount.address }, mode);\n console.log(pc.cyan(pc.bold(`\\n OWS Wallet: ${name}\\n`)));\n console.log(` EVM Address: ${pc.green(evmAccount.address)}\\n`);\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n\n // ── balance ──\n\n ows\n .command(\"balance <name>\")\n .description(\"Show on-chain balance for an OWS wallet\")\n .action(async (name: string) => {\n try {\n const o = loadOws();\n const w = o.getWallet(name);\n const evmAccount = w.accounts.find(\n (a: { chainId: string }) => a.chainId.startsWith(\"eip155:\"),\n );\n if (!evmAccount) throw new Error(`OWS wallet \"${name}\" has no EVM account`);\n\n const chainOpt = parent.opts<{ chain?: string }>().chain;\n const chainName = chainOpt ?? \"hyperevm\";\n const bal = await getEvmBalance(evmAccount.address, chainName);\n const mode = getOpts();\n if (mode.json) {\n return printOutput(\n { wallet: name, chain: chainName, address: evmAccount.address, ...bal },\n mode,\n );\n }\n console.log(pc.cyan(pc.bold(`\\n ${name} — ${chainName}\\n`)));\n console.log(` Address: ${pc.green(evmAccount.address)}`);\n console.log(` ${pc.bold(bal.native_token)}: ${bal.balance}\\n`);\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n\n // ── delete ──\n\n ows\n .command(\"delete <name>\")\n .description(\"Delete an OWS wallet from the vault\")\n .action(async (name: string) => {\n try {\n const o = loadOws();\n const w = o.getWallet(name);\n o.deleteWallet(name);\n const mode = getOpts();\n if (mode.json) return printOutput({ deleted: name, id: w.id }, mode);\n console.log(pc.yellow(`\\n OWS wallet \"${name}\" deleted from vault.\\n`));\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n\n // ── info ──\n\n ows\n .command(\"info <name>\")\n .description(\"Show detailed OWS wallet info (all chains & derivation paths)\")\n .action(async (name: string) => {\n try {\n const o = loadOws();\n const w = o.getWallet(name);\n const mode = getOpts();\n if (mode.json) return printOutput(w, mode);\n console.log(pc.cyan(pc.bold(`\\n OWS Wallet: ${w.name}\\n`)));\n console.log(` ID: ${pc.gray(w.id)}`);\n console.log(` Created: ${pc.gray(w.createdAt)}`);\n console.log();\n for (const acct of w.accounts) {\n console.log(` ${pc.cyan(acct.chainId.padEnd(40))} ${pc.green(acct.address)}`);\n console.log(` ${pc.gray(\" \".repeat(40) + acct.derivationPath)}`);\n }\n console.log();\n } catch (e) {\n handleOwsError(e, getOpts);\n }\n });\n}\n\n// ── Error handler ──\n\nfunction handleOwsError(e: unknown, getOpts: () => OutputMode): void {\n const msg = errMsg(e);\n const mode = getOpts();\n if (mode.json) {\n printOutput({ error: msg }, mode);\n } else {\n console.error(pc.red(`\\n OWS error: ${msg}\\n`));\n }\n process.exit(1);\n}\n"],"mappings":"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","names":["encodeFunctionData","parseAbi","TxStatus","InterestRateMode","ProtocolCategory","encodeFunctionData","parseAbi","createPublicClient","http","decodeFunctionResult","decodeAbiParameters","zeroAddress","decodeAddress","_addressDecodeAbi","decodeSymbol","_symbolDecodeAbi","erc20Abi","u256ToF64","DefiError","abi","veAbi","voterAbi","lbQuoterAbi","HYPEREVM_TOKENS","positionManagerAbi","ERC20_ABI","POOL_ABI","ORACLE_ABI","SECONDS_PER_YEAR","ERC4626_ABI","client","amountOut","best","errMsg","poolAbi","result","multicallRead","algebraFactoryAbi","data","ids","priceX","priceY","decX","decY","MAX_UINT256","InterestRateMode","decodeU256","createRequire","createPublicClient","http","parseAbi","encodeFunctionData","errMsg","jsonVal","createPublicClient","http","init_dist","parseAbi","encodeFunctionData","decodeFunctionResult","createPublicClient","http","zeroAddress","readFileSync","resolve","parse","privateKeyToAccount","privateKeyToAccount","parseAbi","ERC20_DECIMALS_ABI","createOracleFromLending","encodeFunctionData","decodeFunctionResult","chain","makeExecutor","createPublicClient","http","lp","zeroAddress","poolAbi","tx","result","gaugeAdapter","erc20Abi","tokenA","tokenB","init_dist","makeExecutor","init_dist","makeExecutor","amountWei","encodeFunctionData","parseAbi","readdirSync","readFileSync","existsSync","resolve","encodeFunctionData","parseAbi","ERC20_ABI","ORACLE_ABI","POOL_ABI","ERC20_ABI","parseAbi","POOL_ABI","ORACLE_ABI","decodeU256","encodeFunctionData","init_dist","resolveAsset","createPublicClient","http","createPublicClient","http","createPublicClient","http","makeExecutor","createPublicClient","http","encodeFunctionData","parseAbi","LIFI_API","makeExecutor","pc","existsSync","mkdirSync","readFileSync","writeFileSync","resolve","privateKeyToAccount","program","pc","createPublicClient","http","formatEther","createPublicClient","http","formatEther","makeTable","pc","_require","createRequire"]}