logiqical 0.2.0 → 0.3.0
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.
- package/README.md +402 -81
- package/dist/cli.mjs +3278 -0
- package/dist/index.d.mts +749 -792
- package/dist/index.d.ts +749 -792
- package/dist/index.js +2283 -774
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2268 -773
- package/dist/index.mjs.map +1 -0
- package/package.json +20 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/wallet.ts","../src/policy.ts","../src/modules/swap.ts","../src/constants.ts","../src/modules/staking.ts","../src/modules/launchpad.ts","../src/modules/dex.ts","../src/modules/perps.ts","../src/modules/bridge.ts","../src/modules/tickets.ts","../src/modules/social.ts","../src/modules/signals.ts","../src/modules/market.ts","../src/modules/defi.ts","../src/errors.ts"],"sourcesContent":["import { ethers, JsonRpcProvider, Contract } from \"ethers\";\nimport { AgentWallet, CHAINS } from \"./wallet.js\";\nimport { PolicyEngine, PolicyError, type SpendingPolicy } from \"./policy.js\";\nimport { SwapModule } from \"./modules/swap.js\";\nimport { StakingModule } from \"./modules/staking.js\";\nimport { LaunchpadModule } from \"./modules/launchpad.js\";\nimport { DexModule } from \"./modules/dex.js\";\nimport { PerpsModule } from \"./modules/perps.js\";\nimport { BridgeModule } from \"./modules/bridge.js\";\nimport { TicketsModule } from \"./modules/tickets.js\";\nimport { SocialModule } from \"./modules/social.js\";\nimport { SignalsModule } from \"./modules/signals.js\";\nimport { MarketModule } from \"./modules/market.js\";\nimport { DefiModule } from \"./modules/defi.js\";\nimport type { UnsignedTx, CallIntent, TransactionResult } from \"./types.js\";\nimport type { TransactionResponse } from \"ethers\";\n\nexport interface LogiqicalConfig {\n /** Private key — creates a local wallet for signing (0x-prefixed hex) */\n privateKey?: string;\n /** Mnemonic phrase — derives wallet from HD path */\n mnemonic?: string;\n /** Wallet address (required if no privateKey/mnemonic) */\n wallet?: string;\n /** Arena API key for social, perps, tickets endpoints */\n arenaApiKey?: string;\n /** Network name from chain registry (default: \"avalanche\") */\n network?: string;\n /** Custom RPC URL (overrides network) */\n rpcUrl?: string;\n /** Agent display name */\n name?: string;\n /** Password for keystore encryption (default: \"logiqical-agent\") */\n password?: string;\n /** Spending policy — per-tx limits, budgets, allowlists, simulation */\n policy?: SpendingPolicy;\n}\n\n/**\n * Logiqical — standalone agent wallet SDK for Avalanche + Arena.\n *\n * ```ts\n * import { Logiqical } from \"logiqical\";\n *\n * const agent = await Logiqical.boot({\n * policy: { maxPerTx: \"1.0\", maxPerDay: \"10.0\", simulateBeforeSend: true },\n * });\n *\n * // One-liner: policy check + simulate + sign + broadcast\n * await agent.execute(agent.dex.buildSwap(agent.address, \"AVAX\", \"USDC\", \"1.0\"));\n * ```\n */\nexport class Logiqical {\n /** Buy/sell ARENA tokens via LFJ DEX */\n readonly swap: SwapModule;\n /** Stake ARENA tokens for rewards */\n readonly staking: StakingModule;\n /** Discover, research, and trade launchpad tokens on bonding curves */\n readonly launchpad: LaunchpadModule;\n /** Swap any Avalanche token via LFJ DEX */\n readonly dex: DexModule;\n /** Trade perpetual futures on Hyperliquid via Arena */\n readonly perps: PerpsModule;\n /** Cross-chain token bridging via Li.Fi */\n readonly bridge: BridgeModule;\n /** Buy/sell Arena tickets */\n readonly tickets: TicketsModule;\n /** Arena social: chat, DMs, posts, follow, user discovery */\n readonly social: SocialModule;\n /** Market signals intelligence — scan, funding rates, whale tracking */\n readonly signals: SignalsModule;\n /** Market data — prices, trending, top coins via CoinGecko */\n readonly market: MarketModule;\n /** DeFi — sAVAX liquid staking + ERC-4626 vaults */\n readonly defi: DefiModule;\n\n /** The agent's wallet address */\n readonly address: string;\n /** The local wallet (null if read-only mode) */\n readonly agentWallet: AgentWallet | null;\n /** The JSON-RPC provider for direct chain reads */\n readonly provider: JsonRpcProvider;\n /** The spending policy engine */\n readonly policyEngine: PolicyEngine;\n\n private config: LogiqicalConfig;\n\n constructor(config: LogiqicalConfig) {\n this.config = config;\n this.policyEngine = new PolicyEngine(config.policy);\n\n if (config.privateKey) {\n this.agentWallet = AgentWallet.fromPrivateKey(config.privateKey, {\n network: config.network,\n rpcUrl: config.rpcUrl,\n });\n this.provider = this.agentWallet.provider;\n this.address = this.agentWallet.address;\n } else if (config.mnemonic) {\n const hdWallet = ethers.HDNodeWallet.fromPhrase(config.mnemonic);\n this.agentWallet = AgentWallet.fromPrivateKey(hdWallet.privateKey, {\n network: config.network,\n rpcUrl: config.rpcUrl,\n });\n this.provider = this.agentWallet.provider;\n this.address = this.agentWallet.address;\n } else if (config.wallet) {\n this.agentWallet = null;\n const { provider } = Logiqical.resolveProvider(config);\n this.provider = provider;\n this.address = config.wallet;\n } else {\n throw new Error(\"Provide privateKey, mnemonic, or wallet (read-only).\");\n }\n\n // On-chain modules (direct contract calls via provider)\n this.swap = new SwapModule(this.provider);\n this.staking = new StakingModule(this.provider);\n this.launchpad = new LaunchpadModule(this.provider);\n this.dex = new DexModule(this.provider);\n this.tickets = new TicketsModule(this.provider);\n\n // API modules (direct external API calls)\n this.perps = new PerpsModule(config.arenaApiKey);\n this.social = new SocialModule(config.arenaApiKey);\n this.bridge = new BridgeModule();\n this.signals = new SignalsModule();\n this.market = new MarketModule();\n this.defi = new DefiModule(this.provider);\n }\n\n // ── Factory Methods ──\n\n /** Generate a brand new agent wallet */\n static generate(config: Omit<LogiqicalConfig, \"privateKey\" | \"mnemonic\" | \"wallet\"> = {}): Logiqical {\n const wallet = AgentWallet.generate({ network: config.network, rpcUrl: config.rpcUrl });\n return new Logiqical({ ...config, privateKey: wallet.privateKey });\n }\n\n /** Boot from encrypted keystore — creates wallet on first run, loads on subsequent runs */\n static async boot(config: Omit<LogiqicalConfig, \"privateKey\" | \"mnemonic\" | \"wallet\"> & { keystoreName?: string } = {}): Promise<Logiqical> {\n const wallet = await AgentWallet.boot({\n network: config.network,\n rpcUrl: config.rpcUrl,\n password: config.password,\n keystoreName: config.keystoreName,\n });\n return new Logiqical({ ...config, privateKey: wallet.privateKey });\n }\n\n // ── Core Agent Operations ──\n\n /**\n * Execute any module result — policy check + simulate + sign + broadcast.\n *\n * ```ts\n * await agent.execute(agent.dex.buildSwap(agent.address, \"AVAX\", \"USDC\", \"1.0\"));\n * await agent.execute(agent.launchpad.buildBuy(agent.address, \"42\", \"0.5\"));\n * ```\n */\n async execute(\n resultOrPromise: Promise<{ transactions?: UnsignedTx[]; transaction?: UnsignedTx; [key: string]: any }> | { transactions?: UnsignedTx[]; transaction?: UnsignedTx; [key: string]: any },\n confirmations = 1,\n ): Promise<TransactionResult[]> {\n this.requireWallet(\"execute\");\n const result = await resultOrPromise;\n\n const txs: UnsignedTx[] = result.transactions\n ?? (result.transaction ? [result.transaction] : []);\n\n if (txs.length === 0) throw new Error(\"No transactions to execute.\");\n\n const results: TransactionResult[] = [];\n for (const utx of txs) {\n // Policy check\n this.policyEngine.check(utx);\n\n // Simulation\n if (this.policyEngine.shouldSimulate) {\n await this.simulate(utx);\n }\n\n // Dry run — don't broadcast\n if (this.policyEngine.isDryRun) {\n results.push({\n hash: \"0x_dry_run\",\n receipt: { status: 1, blockNumber: 0, gasUsed: \"0\", transactionHash: \"0x_dry_run\" },\n });\n continue;\n }\n\n // Sign + broadcast\n const txResponse = await this.agentWallet!.signAndBroadcast(utx);\n const receipt = await txResponse.wait(confirmations);\n if (!receipt) throw new Error(`Transaction ${txResponse.hash} failed — no receipt.`);\n\n // Record spend for budget tracking\n const value = utx.value ? BigInt(utx.value) : 0n;\n if (value > 0n) this.policyEngine.recordSpend(value);\n\n results.push({\n hash: txResponse.hash,\n receipt: {\n status: receipt.status ?? 0,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed.toString(),\n transactionHash: receipt.hash,\n },\n });\n }\n return results;\n }\n\n /**\n * Call any smart contract method — policy check + simulate + sign + broadcast.\n *\n * ```ts\n * await agent.call({\n * contract: \"0x...\",\n * abi: [\"function transfer(address,uint256) returns (bool)\"],\n * method: \"transfer\",\n * args: [\"0xRecipient\", ethers.parseUnits(\"100\", 18)],\n * });\n * ```\n */\n async call(intent: CallIntent): Promise<TransactionResult> {\n this.requireWallet(\"call\");\n\n // Build an UnsignedTx equivalent for policy check\n const iface = new ethers.Interface(intent.abi);\n const data = iface.encodeFunctionData(intent.method, intent.args ?? []);\n const valueWei = intent.value ? ethers.parseEther(intent.value).toString() : \"0\";\n const policyTx: UnsignedTx = { to: intent.contract, data, value: valueWei, chainId: 43114 };\n this.policyEngine.check(policyTx);\n\n if (this.policyEngine.shouldSimulate) {\n await this.simulate(policyTx);\n }\n\n if (this.policyEngine.isDryRun) {\n return { hash: \"0x_dry_run\", receipt: { status: 1, blockNumber: 0, gasUsed: \"0\", transactionHash: \"0x_dry_run\" } };\n }\n\n const contract = new Contract(\n ethers.getAddress(intent.contract),\n intent.abi,\n this.agentWallet!.wallet,\n );\n const tx: TransactionResponse = await contract[intent.method](\n ...(intent.args ?? []),\n {\n value: intent.value ? ethers.parseEther(intent.value) : undefined,\n gasLimit: intent.gasLimit ?? undefined,\n },\n );\n const receipt = await tx.wait(1);\n if (!receipt) throw new Error(`Transaction ${tx.hash} failed — no receipt.`);\n\n if (intent.value) {\n this.policyEngine.recordSpend(ethers.parseEther(intent.value));\n }\n\n return {\n hash: tx.hash,\n receipt: {\n status: receipt.status ?? 0,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed.toString(),\n transactionHash: receipt.hash,\n },\n };\n }\n\n /** Send native token (AVAX) — policy check + simulate + sign + broadcast */\n async send(to: string, amount: string): Promise<TransactionResult> {\n this.requireWallet(\"send\");\n const valueWei = ethers.parseEther(amount);\n const policyTx: UnsignedTx = { to, data: \"0x\", value: valueWei.toString(), chainId: 43114 };\n this.policyEngine.check(policyTx);\n\n if (this.policyEngine.isDryRun) {\n return { hash: \"0x_dry_run\", receipt: { status: 1, blockNumber: 0, gasUsed: \"0\", transactionHash: \"0x_dry_run\" } };\n }\n\n const tx = await this.agentWallet!.send(to, amount);\n const receipt = await tx.wait(1);\n if (!receipt) throw new Error(`Transaction ${tx.hash} failed — no receipt.`);\n\n this.policyEngine.recordSpend(valueWei);\n\n return {\n hash: tx.hash,\n receipt: {\n status: receipt.status ?? 0,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed.toString(),\n transactionHash: receipt.hash,\n },\n };\n }\n\n /** Simulate a transaction via eth_call — throws PolicyError if it would revert */\n async simulate(tx: UnsignedTx): Promise<void> {\n try {\n await this.provider.call({\n to: tx.to,\n data: tx.data,\n value: tx.value ? BigInt(tx.value) : undefined,\n from: this.address,\n });\n } catch (e: any) {\n throw new PolicyError(\n `Simulation failed: ${e.reason || e.message || \"transaction would revert\"}`,\n \"SIMULATION_FAILED\",\n );\n }\n }\n\n // ── Policy ──\n\n /** Get the current spending policy */\n getPolicy(): SpendingPolicy { return this.policyEngine.getPolicy(); }\n\n /** Replace the entire spending policy */\n setPolicy(policy: SpendingPolicy): void { this.policyEngine.setPolicy(policy); }\n\n /** Update specific policy fields */\n updatePolicy(updates: Partial<SpendingPolicy>): void { this.policyEngine.updatePolicy(updates); }\n\n /** Get budget status: spent this hour, today, remaining */\n getBudgetStatus() { return this.policyEngine.getBudgetStatus(); }\n\n // ── Read Operations (no signing needed) ──\n\n /** Check if this client has a local wallet for signing */\n get canSign(): boolean { return this.agentWallet !== null; }\n\n /** The private key (only available in wallet mode) */\n get privateKey(): string {\n this.requireWallet(\"privateKey\");\n return this.agentWallet!.privateKey;\n }\n\n /** Get native token balance (formatted) */\n async getBalance(): Promise<string> {\n if (this.agentWallet) return this.agentWallet.getBalance();\n const balance = await this.provider.getBalance(this.address);\n return ethers.formatEther(balance);\n }\n\n /** Sign a message */\n async signMessage(message: string): Promise<string> {\n this.requireWallet(\"signMessage\");\n return this.agentWallet!.signMessage(message);\n }\n\n /** Sign EIP-712 typed data */\n async signTypedData(domain: any, types: any, value: any): Promise<string> {\n this.requireWallet(\"signTypedData\");\n return this.agentWallet!.signTypedData(domain, types, value);\n }\n\n /** Switch to a different network (returns new Logiqical instance with same keys) */\n switchNetwork(network: string): Logiqical {\n this.requireWallet(\"switchNetwork\");\n return new Logiqical({\n ...this.config,\n privateKey: this.agentWallet!.privateKey,\n mnemonic: undefined,\n wallet: undefined,\n network,\n });\n }\n\n /** Save the wallet to an encrypted keystore file */\n async saveKeystore(password?: string, name?: string): Promise<string> {\n this.requireWallet(\"saveKeystore\");\n return this.agentWallet!.saveKeystore(password, name);\n }\n\n // ── Low-level (advanced — bypasses policy) ──\n\n /** Sign and broadcast a single unsigned tx — bypasses policy engine */\n async signAndBroadcast(unsignedTx: UnsignedTx): Promise<TransactionResponse> {\n this.requireWallet(\"signAndBroadcast\");\n return this.agentWallet!.signAndBroadcast(unsignedTx);\n }\n\n /** Sign and broadcast multiple unsigned txs — bypasses policy engine */\n async signAndBroadcastAll(unsignedTxs: UnsignedTx[], confirmations = 1): Promise<TransactionResponse[]> {\n this.requireWallet(\"signAndBroadcastAll\");\n return this.agentWallet!.signAndBroadcastAll(unsignedTxs, confirmations);\n }\n\n // ── Internal ──\n\n private requireWallet(method: string): void {\n if (!this.agentWallet) throw new Error(`No local wallet — cannot ${method}(). Provide privateKey or use Logiqical.boot().`);\n }\n\n private static resolveProvider(config: { network?: string; rpcUrl?: string }): { provider: JsonRpcProvider } {\n const networkKey = config.network ?? \"avalanche\";\n const chain = CHAINS[networkKey];\n if (!chain && !config.rpcUrl) {\n throw new Error(`Unknown network \"${networkKey}\". Use: ${Object.keys(CHAINS).join(\", \")} — or provide rpcUrl.`);\n }\n const rpcUrl = config.rpcUrl ?? chain.rpcUrl;\n const chainId = chain?.chainId ?? undefined;\n return { provider: new JsonRpcProvider(rpcUrl, chainId) };\n }\n}\n\n/** @deprecated Use `Logiqical` instead */\nexport const LogiqicalClient = Logiqical;\n","import {\n Wallet,\n JsonRpcProvider,\n type TransactionRequest,\n type TransactionResponse,\n} from \"ethers\";\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\n// ── Chain Registry ──\n\nexport interface ChainConfig {\n chainId: number;\n name: string;\n rpcUrl: string;\n nativeCurrency: { name: string; symbol: string; decimals: number };\n blockExplorer?: string;\n}\n\nexport const CHAINS: Record<string, ChainConfig> = {\n avalanche: {\n chainId: 43114,\n name: \"Avalanche C-Chain\",\n rpcUrl: \"https://api.avax.network/ext/bc/C/rpc\",\n nativeCurrency: { name: \"Avalanche\", symbol: \"AVAX\", decimals: 18 },\n blockExplorer: \"https://snowtrace.io\",\n },\n fuji: {\n chainId: 43113,\n name: \"Avalanche Fuji Testnet\",\n rpcUrl: \"https://api.avax-test.network/ext/bc/C/rpc\",\n nativeCurrency: { name: \"Avalanche\", symbol: \"AVAX\", decimals: 18 },\n blockExplorer: \"https://testnet.snowtrace.io\",\n },\n ethereum: {\n chainId: 1,\n name: \"Ethereum\",\n rpcUrl: \"https://eth.llamarpc.com\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://etherscan.io\",\n },\n base: {\n chainId: 8453,\n name: \"Base\",\n rpcUrl: \"https://mainnet.base.org\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://basescan.org\",\n },\n arbitrum: {\n chainId: 42161,\n name: \"Arbitrum One\",\n rpcUrl: \"https://arb1.arbitrum.io/rpc\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://arbiscan.io\",\n },\n optimism: {\n chainId: 10,\n name: \"Optimism\",\n rpcUrl: \"https://mainnet.optimism.io\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://optimistic.etherscan.io\",\n },\n polygon: {\n chainId: 137,\n name: \"Polygon\",\n rpcUrl: \"https://polygon-rpc.com\",\n nativeCurrency: { name: \"MATIC\", symbol: \"MATIC\", decimals: 18 },\n blockExplorer: \"https://polygonscan.com\",\n },\n bsc: {\n chainId: 56,\n name: \"BNB Smart Chain\",\n rpcUrl: \"https://bsc-dataseed.binance.org\",\n nativeCurrency: { name: \"BNB\", symbol: \"BNB\", decimals: 18 },\n blockExplorer: \"https://bscscan.com\",\n },\n fantom: {\n chainId: 250,\n name: \"Fantom Opera\",\n rpcUrl: \"https://rpc.ftm.tools\",\n nativeCurrency: { name: \"Fantom\", symbol: \"FTM\", decimals: 18 },\n blockExplorer: \"https://ftmscan.com\",\n },\n gnosis: {\n chainId: 100,\n name: \"Gnosis Chain\",\n rpcUrl: \"https://rpc.gnosischain.com\",\n nativeCurrency: { name: \"xDAI\", symbol: \"xDAI\", decimals: 18 },\n blockExplorer: \"https://gnosisscan.io\",\n },\n zksync: {\n chainId: 324,\n name: \"zkSync Era\",\n rpcUrl: \"https://mainnet.era.zksync.io\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://explorer.zksync.io\",\n },\n linea: {\n chainId: 59144,\n name: \"Linea\",\n rpcUrl: \"https://rpc.linea.build\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://lineascan.build\",\n },\n scroll: {\n chainId: 534352,\n name: \"Scroll\",\n rpcUrl: \"https://rpc.scroll.io\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://scrollscan.com\",\n },\n blast: {\n chainId: 81457,\n name: \"Blast\",\n rpcUrl: \"https://rpc.blast.io\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://blastscan.io\",\n },\n mantle: {\n chainId: 5000,\n name: \"Mantle\",\n rpcUrl: \"https://rpc.mantle.xyz\",\n nativeCurrency: { name: \"MNT\", symbol: \"MNT\", decimals: 18 },\n blockExplorer: \"https://mantlescan.xyz\",\n },\n celo: {\n chainId: 42220,\n name: \"Celo\",\n rpcUrl: \"https://forno.celo.org\",\n nativeCurrency: { name: \"CELO\", symbol: \"CELO\", decimals: 18 },\n blockExplorer: \"https://celoscan.io\",\n },\n moonbeam: {\n chainId: 1284,\n name: \"Moonbeam\",\n rpcUrl: \"https://rpc.api.moonbeam.network\",\n nativeCurrency: { name: \"GLMR\", symbol: \"GLMR\", decimals: 18 },\n blockExplorer: \"https://moonscan.io\",\n },\n sei: {\n chainId: 1329,\n name: \"Sei\",\n rpcUrl: \"https://evm-rpc.sei-apis.com\",\n nativeCurrency: { name: \"SEI\", symbol: \"SEI\", decimals: 18 },\n blockExplorer: \"https://seitrace.com\",\n },\n mode: {\n chainId: 34443,\n name: \"Mode\",\n rpcUrl: \"https://mainnet.mode.network\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://explorer.mode.network\",\n },\n aurora: {\n chainId: 1313161554,\n name: \"Aurora\",\n rpcUrl: \"https://mainnet.aurora.dev\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://explorer.aurora.dev\",\n },\n};\n\n// ── Keystore ──\n\nconst KEYSTORE_DIR = join(homedir(), \".logiqical\", \"keys\");\n\nexport interface KeystoreData {\n address: string;\n encryptedJson: string;\n network: string;\n createdAt: string;\n}\n\nfunction ensureKeystoreDir(): void {\n if (!existsSync(KEYSTORE_DIR)) {\n mkdirSync(KEYSTORE_DIR, { recursive: true });\n }\n}\n\n// ── Agent Wallet ──\n\nexport interface AgentWalletConfig {\n /** Network name from CHAINS registry, or a custom RPC URL */\n network?: string;\n /** Custom RPC URL (overrides network preset) */\n rpcUrl?: string;\n /** Private key to import (0x-prefixed hex) */\n privateKey?: string;\n /** Password for keystore encryption/decryption */\n password?: string;\n /** Keystore file name (default: \"agent\") */\n keystoreName?: string;\n}\n\nexport class AgentWallet {\n readonly wallet: Wallet;\n readonly provider: JsonRpcProvider;\n readonly chain: ChainConfig;\n readonly address: string;\n\n private constructor(wallet: Wallet, provider: JsonRpcProvider, chain: ChainConfig) {\n this.wallet = wallet;\n this.provider = provider;\n this.chain = chain;\n this.address = wallet.address;\n }\n\n /** The private key (use carefully) */\n get privateKey(): string {\n return this.wallet.privateKey;\n }\n\n // ── Factory Methods ──\n\n /** Generate a brand new wallet with a random private key */\n static generate(config: AgentWalletConfig = {}): AgentWallet {\n const { provider, chain } = AgentWallet.resolveProvider(config);\n const hdWallet = Wallet.createRandom();\n const wallet = new Wallet(hdWallet.privateKey, provider);\n return new AgentWallet(wallet, provider, chain);\n }\n\n /** Import an existing wallet from a private key */\n static fromPrivateKey(privateKey: string, config: AgentWalletConfig = {}): AgentWallet {\n const { provider, chain } = AgentWallet.resolveProvider(config);\n const wallet = new Wallet(privateKey, provider);\n return new AgentWallet(wallet, provider, chain);\n }\n\n /** Boot from encrypted keystore, or generate + save if none exists */\n static async boot(config: AgentWalletConfig = {}): Promise<AgentWallet> {\n const password = config.password ?? \"logiqical-agent\";\n const name = config.keystoreName ?? \"agent\";\n const keystorePath = join(KEYSTORE_DIR, `${name}.json`);\n\n const { provider, chain } = AgentWallet.resolveProvider(config);\n\n if (existsSync(keystorePath)) {\n const data: KeystoreData = JSON.parse(readFileSync(keystorePath, \"utf-8\"));\n const decrypted = await Wallet.fromEncryptedJson(data.encryptedJson, password);\n const connected = new Wallet(decrypted.privateKey, provider);\n return new AgentWallet(connected, provider, chain);\n }\n\n // Generate new wallet and save to keystore\n const hdWallet = Wallet.createRandom();\n const wallet = new Wallet(hdWallet.privateKey, provider);\n const agentWallet = new AgentWallet(wallet, provider, chain);\n await agentWallet.saveKeystore(password, name);\n return agentWallet;\n }\n\n // ── Keystore Operations ──\n\n /** Encrypt and save the wallet to the keystore directory */\n async saveKeystore(password?: string, name?: string): Promise<string> {\n const pw = password ?? \"logiqical-agent\";\n const n = name ?? \"agent\";\n ensureKeystoreDir();\n const encryptedJson = await this.wallet.encrypt(pw);\n const data: KeystoreData = {\n address: this.address,\n encryptedJson,\n network: this.chain.name,\n createdAt: new Date().toISOString(),\n };\n const keystorePath = join(KEYSTORE_DIR, `${n}.json`);\n writeFileSync(keystorePath, JSON.stringify(data, null, 2));\n return keystorePath;\n }\n\n // ── Core Operations ──\n\n /** Get native token balance (formatted) */\n async getBalance(): Promise<string> {\n const balance = await this.provider.getBalance(this.address);\n const { formatEther } = await import(\"ethers\");\n return formatEther(balance);\n }\n\n /** Get balance of any address */\n async getBalanceOf(address: string): Promise<string> {\n const balance = await this.provider.getBalance(address);\n const { formatEther } = await import(\"ethers\");\n return formatEther(balance);\n }\n\n /** Sign a message */\n async signMessage(message: string): Promise<string> {\n return this.wallet.signMessage(message);\n }\n\n /** Sign typed data (EIP-712) */\n async signTypedData(domain: any, types: any, value: any): Promise<string> {\n return this.wallet.signTypedData(domain, types, value);\n }\n\n /** Sign a transaction without broadcasting */\n async signTransaction(tx: TransactionRequest): Promise<string> {\n return this.wallet.signTransaction(tx);\n }\n\n /** Sign and broadcast a transaction */\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResponse> {\n return this.wallet.sendTransaction(tx);\n }\n\n /** Send native token to an address */\n async send(to: string, amount: string): Promise<TransactionResponse> {\n const { parseEther } = await import(\"ethers\");\n return this.wallet.sendTransaction({\n to,\n value: parseEther(amount),\n });\n }\n\n /**\n * Sign and broadcast an unsigned tx object returned by the Logiqical API.\n * Handles the { to, data, value, chainId, gas/gasLimit } format.\n */\n async signAndBroadcast(unsignedTx: {\n to: string;\n data: string;\n value: string;\n chainId?: number;\n gas?: string;\n gasLimit?: string;\n }): Promise<TransactionResponse> {\n const tx: TransactionRequest = {\n to: unsignedTx.to,\n data: unsignedTx.data,\n value: unsignedTx.value,\n };\n if (unsignedTx.gasLimit || unsignedTx.gas) {\n tx.gasLimit = unsignedTx.gasLimit || unsignedTx.gas;\n }\n return this.wallet.sendTransaction(tx);\n }\n\n /**\n * Sign and broadcast multiple unsigned txs in sequence.\n * Waits for each to confirm before sending the next.\n */\n async signAndBroadcastAll(\n unsignedTxs: Array<{ to: string; data: string; value: string; chainId?: number; gas?: string; gasLimit?: string }>,\n confirmations = 1,\n ): Promise<TransactionResponse[]> {\n const results: TransactionResponse[] = [];\n for (const utx of unsignedTxs) {\n const txResponse = await this.signAndBroadcast(utx);\n await txResponse.wait(confirmations);\n results.push(txResponse);\n }\n return results;\n }\n\n /** Call a read-only contract method (no gas, no signing) */\n async call(tx: TransactionRequest): Promise<string> {\n return this.provider.call(tx);\n }\n\n /** Switch to a different network (returns new AgentWallet instance) */\n switchNetwork(network: string): AgentWallet {\n const { provider, chain } = AgentWallet.resolveProvider({ network });\n const wallet = new Wallet(this.privateKey, provider);\n return new AgentWallet(wallet, provider, chain);\n }\n\n // ── Internal ──\n\n private static resolveProvider(config: AgentWalletConfig): { provider: JsonRpcProvider; chain: ChainConfig } {\n const networkKey = config.network ?? \"avalanche\";\n const chain = CHAINS[networkKey];\n\n if (!chain && !config.rpcUrl) {\n throw new Error(`Unknown network \"${networkKey}\". Use a known chain (${Object.keys(CHAINS).join(\", \")}) or provide rpcUrl.`);\n }\n\n const rpcUrl = config.rpcUrl ?? chain.rpcUrl;\n const resolvedChain = chain ?? {\n chainId: 0,\n name: networkKey,\n rpcUrl,\n nativeCurrency: { name: \"ETH\", symbol: \"ETH\", decimals: 18 },\n };\n\n const provider = new JsonRpcProvider(rpcUrl, resolvedChain.chainId || undefined);\n return { provider, chain: resolvedChain };\n }\n}\n","import { ethers } from \"ethers\";\nimport type { UnsignedTx } from \"./types.js\";\n\n/** Spending policy configuration */\nexport interface SpendingPolicy {\n /** Max native token (e.g. AVAX) per single transaction in human-readable units */\n maxPerTx?: string;\n /** Max native token spend per hour */\n maxPerHour?: string;\n /** Max native token spend per day (24h rolling) */\n maxPerDay?: string;\n /** Allowed contract addresses (if set, only these can be called) */\n allowedContracts?: string[];\n /** Blocked contract addresses (rejected even if in allowedContracts) */\n blockedContracts?: string[];\n /** Simulate (eth_call) before sending — catches reverts before spending gas */\n simulateBeforeSend?: boolean;\n /** Dry run mode — simulate everything, broadcast nothing */\n dryRun?: boolean;\n}\n\ninterface SpendRecord {\n amount: bigint;\n timestamp: number;\n}\n\nexport class PolicyEngine {\n private policy: SpendingPolicy;\n private spendLog: SpendRecord[] = [];\n\n constructor(policy: SpendingPolicy = {}) {\n this.policy = policy;\n }\n\n getPolicy(): SpendingPolicy { return { ...this.policy }; }\n\n setPolicy(policy: SpendingPolicy): void {\n this.policy = policy;\n }\n\n updatePolicy(updates: Partial<SpendingPolicy>): void {\n this.policy = { ...this.policy, ...updates };\n }\n\n /** Check a transaction against the policy. Throws if rejected. */\n check(tx: UnsignedTx): void {\n const value = tx.value ? BigInt(tx.value) : 0n;\n\n // Per-tx limit\n if (this.policy.maxPerTx) {\n const max = ethers.parseEther(this.policy.maxPerTx);\n if (value > max) {\n throw new PolicyError(\n `Transaction value ${ethers.formatEther(value)} exceeds per-tx limit of ${this.policy.maxPerTx}`,\n \"MAX_PER_TX_EXCEEDED\",\n );\n }\n }\n\n // Contract allowlist\n if (this.policy.allowedContracts && this.policy.allowedContracts.length > 0) {\n const to = tx.to.toLowerCase();\n const allowed = this.policy.allowedContracts.map(a => a.toLowerCase());\n if (!allowed.includes(to)) {\n throw new PolicyError(\n `Contract ${tx.to} not in allowlist`,\n \"CONTRACT_NOT_ALLOWED\",\n );\n }\n }\n\n // Contract blocklist\n if (this.policy.blockedContracts && this.policy.blockedContracts.length > 0) {\n const to = tx.to.toLowerCase();\n const blocked = this.policy.blockedContracts.map(b => b.toLowerCase());\n if (blocked.includes(to)) {\n throw new PolicyError(\n `Contract ${tx.to} is blocked`,\n \"CONTRACT_BLOCKED\",\n );\n }\n }\n\n // Hourly budget\n if (this.policy.maxPerHour) {\n const max = ethers.parseEther(this.policy.maxPerHour);\n const hourSpend = this.getSpendSince(Date.now() - 3_600_000);\n if (hourSpend + value > max) {\n throw new PolicyError(\n `Would exceed hourly budget of ${this.policy.maxPerHour} AVAX (spent ${ethers.formatEther(hourSpend)} this hour)`,\n \"HOURLY_BUDGET_EXCEEDED\",\n );\n }\n }\n\n // Daily budget\n if (this.policy.maxPerDay) {\n const max = ethers.parseEther(this.policy.maxPerDay);\n const daySpend = this.getSpendSince(Date.now() - 86_400_000);\n if (daySpend + value > max) {\n throw new PolicyError(\n `Would exceed daily budget of ${this.policy.maxPerDay} AVAX (spent ${ethers.formatEther(daySpend)} today)`,\n \"DAILY_BUDGET_EXCEEDED\",\n );\n }\n }\n }\n\n /** Record a spend after successful broadcast */\n recordSpend(value: bigint): void {\n this.spendLog.push({ amount: value, timestamp: Date.now() });\n // Prune records older than 24h\n const cutoff = Date.now() - 86_400_000;\n this.spendLog = this.spendLog.filter(r => r.timestamp > cutoff);\n }\n\n /** Get budget status */\n getBudgetStatus(): { spentLastHour: string; spentLast24h: string; remainingHour: string | null; remainingDay: string | null } {\n const hourSpend = this.getSpendSince(Date.now() - 3_600_000);\n const daySpend = this.getSpendSince(Date.now() - 86_400_000);\n return {\n spentLastHour: ethers.formatEther(hourSpend),\n spentLast24h: ethers.formatEther(daySpend),\n remainingHour: this.policy.maxPerHour\n ? ethers.formatEther(ethers.parseEther(this.policy.maxPerHour) - hourSpend)\n : null,\n remainingDay: this.policy.maxPerDay\n ? ethers.formatEther(ethers.parseEther(this.policy.maxPerDay) - daySpend)\n : null,\n };\n }\n\n get shouldSimulate(): boolean { return this.policy.simulateBeforeSend ?? false; }\n get isDryRun(): boolean { return this.policy.dryRun ?? false; }\n\n private getSpendSince(since: number): bigint {\n return this.spendLog\n .filter(r => r.timestamp > since)\n .reduce((sum, r) => sum + r.amount, 0n);\n }\n}\n\nexport type PolicyErrorCode =\n | \"MAX_PER_TX_EXCEEDED\"\n | \"HOURLY_BUDGET_EXCEEDED\"\n | \"DAILY_BUDGET_EXCEEDED\"\n | \"CONTRACT_NOT_ALLOWED\"\n | \"CONTRACT_BLOCKED\"\n | \"SIMULATION_FAILED\";\n\nexport class PolicyError extends Error {\n constructor(message: string, public readonly code: PolicyErrorCode) {\n super(message);\n this.name = \"PolicyError\";\n }\n}\n","import { ethers, type JsonRpcProvider } from \"ethers\";\nimport {\n ARENA_TOKEN, WAVAX, LB_ROUTER, LB_QUOTER,\n ERC20_ABI, LB_ROUTER_ABI, LB_QUOTER_ABI,\n DEFAULT_SLIPPAGE_BPS, CHAIN_ID,\n} from \"../constants.js\";\nimport type { UnsignedTx } from \"../types.js\";\n\nexport class SwapModule {\n private arenaToken: ethers.Contract;\n private lbQuoter: ethers.Contract;\n\n constructor(private provider: JsonRpcProvider) {\n this.arenaToken = new ethers.Contract(ethers.getAddress(ARENA_TOKEN), ERC20_ABI, provider);\n this.lbQuoter = new ethers.Contract(ethers.getAddress(LB_QUOTER), LB_QUOTER_ABI, provider);\n }\n\n /** Get AVAX and ARENA balances for a wallet */\n async getBalances(wallet: string): Promise<{ avax: string; arena: string; avaxFormatted: string; arenaFormatted: string }> {\n const [avax, arena] = await Promise.all([\n this.provider.getBalance(wallet),\n this.arenaToken.balanceOf(wallet),\n ]);\n const decimals = await this.arenaToken.decimals();\n return {\n avax: avax.toString(),\n arena: arena.toString(),\n avaxFormatted: ethers.formatEther(avax),\n arenaFormatted: ethers.formatUnits(arena, decimals),\n };\n }\n\n /** Quote how much ARENA for a given AVAX amount (includes 0.3% fee) */\n async quote(avaxAmount: string): Promise<{ arenaOut: string; fee: string; netAvax: string; rate: string }> {\n const amountIn = ethers.parseEther(avaxAmount);\n const fee = (amountIn * 30n) / 10000n;\n const netAmount = amountIn - fee;\n\n const route = [WAVAX, ARENA_TOKEN];\n const quote = await this.lbQuoter.findBestPathFromAmountIn(route, netAmount);\n const arenaOut = quote.amounts[quote.amounts.length - 1];\n const decimals = await this.arenaToken.decimals();\n const arenaFormatted = ethers.formatUnits(arenaOut, decimals);\n\n return {\n arenaOut: arenaFormatted,\n fee: ethers.formatEther(fee),\n netAvax: ethers.formatEther(netAmount),\n rate: (parseFloat(arenaFormatted) / parseFloat(ethers.formatEther(netAmount))).toFixed(2),\n };\n }\n\n /** Quote how much AVAX for selling ARENA */\n async sellQuote(arenaAmount: string): Promise<{ avaxOut: string; arenaIn: string; rate: string }> {\n const decimals = await this.arenaToken.decimals();\n const amountIn = ethers.parseUnits(arenaAmount, decimals);\n\n const route = [ARENA_TOKEN, WAVAX];\n const quote = await this.lbQuoter.findBestPathFromAmountIn(route, amountIn);\n const avaxOut = quote.amounts[quote.amounts.length - 1];\n const avaxFormatted = ethers.formatEther(avaxOut);\n\n return {\n avaxOut: avaxFormatted,\n arenaIn: arenaAmount,\n rate: (parseFloat(arenaAmount) / parseFloat(avaxFormatted)).toFixed(2),\n };\n }\n\n /** Build unsigned tx to buy ARENA with AVAX via LFJ DEX */\n async buildBuy(wallet: string, avaxAmount: string, slippageBps = DEFAULT_SLIPPAGE_BPS): Promise<{ transactions: UnsignedTx[]; summary: string }> {\n const amountIn = ethers.parseEther(avaxAmount);\n const route = [WAVAX, ARENA_TOKEN];\n const quote = await this.lbQuoter.findBestPathFromAmountIn(route, amountIn);\n const expectedOut: bigint = quote.amounts[quote.amounts.length - 1];\n if (expectedOut === 0n) throw new Error(\"Quote returned zero — pool may have no liquidity\");\n\n const clampedSlippage = BigInt(Math.max(0, Math.min(10000, Number(slippageBps))));\n const amountOutMin = expectedOut - (expectedOut * clampedSlippage) / 10000n;\n const deadline = Math.floor(Date.now() / 1000) + 3600;\n\n const path = {\n pairBinSteps: [...quote.binSteps].map((b: any) => b.toString()),\n versions: [...quote.versions].map((v: any) => Number(v)),\n tokenPath: [...route],\n };\n\n const iface = new ethers.Interface(LB_ROUTER_ABI);\n const data = iface.encodeFunctionData(\"swapExactNATIVEForTokens\", [amountOutMin, path, wallet, deadline]);\n const decimals = await this.arenaToken.decimals();\n\n return {\n transactions: [{\n to: ethers.getAddress(LB_ROUTER),\n data,\n value: ethers.toBeHex(amountIn, 32),\n chainId: CHAIN_ID,\n gasLimit: \"500000\",\n description: `Buy ARENA with ${avaxAmount} AVAX (~${ethers.formatUnits(expectedOut, decimals)} ARENA)`,\n }],\n summary: `Swap ${avaxAmount} AVAX → ~${ethers.formatUnits(expectedOut, decimals)} ARENA`,\n };\n }\n\n /** Build unsigned txs to sell ARENA for AVAX: [approve, swap] */\n async buildSell(wallet: string, arenaAmount: string, slippageBps = DEFAULT_SLIPPAGE_BPS): Promise<{ transactions: UnsignedTx[] }> {\n const decimals = await this.arenaToken.decimals();\n let sellAmount: bigint;\n\n if (arenaAmount === \"max\") {\n sellAmount = await this.arenaToken.balanceOf(wallet);\n if (sellAmount === 0n) throw new Error(\"No ARENA balance to sell\");\n } else {\n sellAmount = ethers.parseUnits(arenaAmount, decimals);\n }\n\n const route = [ARENA_TOKEN, WAVAX];\n const quote = await this.lbQuoter.findBestPathFromAmountIn(route, sellAmount);\n const expectedOut: bigint = quote.amounts[quote.amounts.length - 1];\n if (expectedOut === 0n) throw new Error(\"Quote returned zero — pool may have no liquidity\");\n\n const clampedSlippage = BigInt(Math.max(0, Math.min(10000, Number(slippageBps))));\n const amountOutMin = expectedOut - (expectedOut * clampedSlippage) / 10000n;\n const deadline = Math.floor(Date.now() / 1000) + 3600;\n\n const path = {\n pairBinSteps: [...quote.binSteps].map((b: any) => b.toString()),\n versions: [...quote.versions].map((v: any) => Number(v)),\n tokenPath: [...route],\n };\n\n const approveIface = new ethers.Interface(ERC20_ABI);\n const approveData = approveIface.encodeFunctionData(\"approve\", [ethers.getAddress(LB_ROUTER), sellAmount]);\n\n const swapIface = new ethers.Interface(LB_ROUTER_ABI);\n const swapData = swapIface.encodeFunctionData(\"swapExactTokensForNATIVE\", [sellAmount, amountOutMin, path, wallet, deadline]);\n\n return {\n transactions: [\n {\n to: ethers.getAddress(ARENA_TOKEN),\n data: approveData,\n value: \"0\",\n chainId: CHAIN_ID,\n gasLimit: \"60000\",\n description: `Approve ${ethers.formatUnits(sellAmount, decimals)} ARENA for swap`,\n },\n {\n to: ethers.getAddress(LB_ROUTER),\n data: swapData,\n value: \"0\",\n chainId: CHAIN_ID,\n gasLimit: \"500000\",\n description: `Sell ${ethers.formatUnits(sellAmount, decimals)} ARENA for ~${ethers.formatEther(expectedOut)} AVAX`,\n },\n ],\n };\n }\n}\n","// ── Avalanche C-Chain ──\nexport const CHAIN_ID = 43114;\n\n// ── Token Addresses ──\nexport const ARENA_TOKEN = \"0xB8d7710f7d8349A506b75dD184F05777c82dAd0C\";\nexport const WAVAX = \"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7\";\n\n// ── Arena Staking ──\nexport const ARENA_STAKING = \"0xeffb809d99142ce3b51c1796c096f5b01b4aaec4\";\n\n// ── LFJ (Trader Joe) V2.2 ──\nexport const LB_ROUTER = \"0x18556DA13313f3532c54711497A8FedAC273220E\";\nexport const LB_QUOTER = \"0x9A550a522BBaDFB69019b0432800Ed17855A51C3\";\n\n// ── Arena Launchpad Contracts ──\nexport const LAUNCH_CONTRACT = \"0x8315f1eb449Dd4B779495C3A0b05e5d194446c6e\";\nexport const TOKEN_MANAGER = \"0x2196e106af476f57618373ec028924767c758464\";\nexport const AVAX_HELPER = \"0x03f1a18519abedbef210fa44e13b71fec01b8dfa\";\nexport const ARENA_PAIRED_THRESHOLD = 100_000_000_000n;\nexport const GRANULARITY_SCALER = 10n ** 18n;\n\n// ── Arena Tickets (Shares) ──\nexport const ARENA_SHARES_CONTRACT = \"0xc605c2cf66ee98ea925b1bb4fea584b71c00cc4c\";\nexport const FRACTION_SCALER = 100;\n\n// ── External APIs ──\nexport const ARENA_SOCIAL_API = \"https://api.starsarena.com\";\nexport const LIFI_API = \"https://li.quest/v1\";\nexport const HL_INFO = \"https://api.hyperliquid.xyz/info\";\n\n// ── Default Settings ──\nexport const DEFAULT_SLIPPAGE_BPS = 500;\n\n// ── ABIs ──\n\nexport const ERC20_ABI = [\n \"function balanceOf(address owner) view returns (uint256)\",\n \"function approve(address spender, uint256 amount) returns (bool)\",\n \"function allowance(address owner, address spender) view returns (uint256)\",\n \"function decimals() view returns (uint8)\",\n \"function symbol() view returns (string)\",\n \"function name() view returns (string)\",\n \"function totalSupply() view returns (uint256)\",\n];\n\nexport const ARENA_STAKING_ABI = [\n \"function deposit(uint256 _amount)\",\n \"function withdraw(uint256 _amount)\",\n \"function emergencyWithdraw()\",\n \"function pendingReward(address _user, address _token) view returns (uint256)\",\n \"function getUserInfo(address _user, address _rewardToken) view returns (uint256, uint256)\",\n \"function rewardTokensLength() view returns (uint256)\",\n];\n\nexport const LB_ROUTER_ABI = [\n \"function swapExactNATIVEForTokens(uint256 amountOutMin, tuple(uint256[] pairBinSteps, uint8[] versions, address[] tokenPath) path, address to, uint256 deadline) payable returns (uint256 amountOut)\",\n \"function swapExactTokensForNATIVE(uint256 amountIn, uint256 amountOutMin, tuple(uint256[] pairBinSteps, uint8[] versions, address[] tokenPath) path, address payable to, uint256 deadline) returns (uint256 amountOut)\",\n];\n\nexport const LB_QUOTER_ABI = [\n \"function findBestPathFromAmountIn(address[] calldata route, uint128 amountIn) view returns (tuple(address[] route, address[] pairs, uint256[] binSteps, uint256[] versions, uint128[] amounts, uint128[] virtualAmountsWithoutSlippage, uint128[] fees) quote)\",\n];\n\nexport const LAUNCH_CONTRACT_ABI = [\n \"function createToken(uint16 a, uint8 b, uint128 curveScaler, uint8 creatorFeeBasisPoints, address tokenCreatorAddress, uint256 tokenSplit, string name, string symbol, uint256 amount) payable\",\n \"function buyAndCreateLpIfPossible(uint256 amount, uint256 tokenId) payable\",\n \"function sell(uint256 amount, uint256 tokenId)\",\n \"function calculateCostWithFees(uint256 amountInToken, uint256 tokenId) view returns (uint256)\",\n \"function calculateRewardWithFees(uint256 amount, uint256 tokenId) view returns (uint256)\",\n \"function getMaxTokensForSale(uint256 tokenId) view returns (uint256)\",\n \"function tokenSupply(uint256 tokenId) view returns (uint256)\",\n \"function getTokenParameters(uint256 tokenId) view returns (uint128 curveScaler, uint16 a, uint8 b, bool lpDeployed, uint8 lpPercentage, uint8 salePercentage, uint8 creatorFeeBasisPoints, address creatorAddress, address pairAddress, address tokenContractAddress)\",\n \"function tokenIdentifier() view returns (uint256)\",\n \"function protocolFeeBasisPoint() view returns (uint256)\",\n \"event Buy(address indexed user, uint256 indexed tokenId, uint256 tokenAmount, uint256 cost, uint256 tokenSupply, address referrerAddress, uint256 referralFee, uint256 creatorFee, uint256 protocolFee)\",\n \"event Sell(address indexed user, uint256 indexed tokenId, uint256 tokenAmount, uint256 reward, uint256 tokenSupply, address referrerAddress, uint256 referralFee, uint256 creatorFee, uint256 protocolFee)\",\n];\n\nexport const TOKEN_MANAGER_ABI = [\n \"function createToken(uint32 a, uint8 b, uint128 curveScaler, uint8 creatorFeeBasisPoints, address tokenCreatorAddress, uint256 tokenSplit, string name, string symbol, uint256 amount)\",\n \"function calculateCostWithFees(uint256 amountInToken, uint256 tokenId) view returns (uint256)\",\n \"function calculateRewardWithFees(uint256 amount, uint256 tokenId) view returns (uint256)\",\n \"function getMaxTokensForSale(uint256 tokenId) view returns (uint256)\",\n \"function tokenSupply(uint256 tokenId) view returns (uint256)\",\n \"function getTokenParameters(uint256 tokenId) view returns (uint128 curveScaler, uint32 a, uint8 b, bool lpDeployed, uint8 lpPercentage, uint8 salePercentage, uint8 creatorFeeBasisPoints, address creatorAddress, address pairAddress, address tokenContractAddress)\",\n \"function tokenIdentifier() view returns (uint256)\",\n \"function protocolFeeBasisPoint() view returns (uint256)\",\n \"event Buy(address indexed user, uint256 indexed tokenId, uint256 tokenAmount, uint256 cost, uint256 tokenSupply, address referrerAddress, uint256 referralFee, uint256 creatorFee, uint256 protocolFee)\",\n \"event Sell(address indexed user, uint256 indexed tokenId, uint256 tokenAmount, uint256 reward, uint256 tokenSupply, address referrerAddress, uint256 referralFee, uint256 creatorFee, uint256 protocolFee)\",\n];\n\nexport const AVAX_HELPER_ABI = [\n \"function buyAndCreateLpIfPossibleWithAvax(uint256 tokenId, uint256 amountOutMin) payable returns (uint256)\",\n \"function sellToAvax(uint256 tokenId, uint256 amount, uint256 amountOutAvaxMin) returns (uint256)\",\n];\n\nexport const SHARES_ABI = [\n \"function buyFractionalShares(address sharesSubject, address user, uint256 amount) payable\",\n \"function sellFractionalShares(address sharesSubject, address user, uint256 amount) payable\",\n \"function getBuyPriceForFractionalSharesAfterFee(address sharesSubject, uint256 amount) view returns (uint256)\",\n \"function getSellPriceForFractionalSharesAfterFee(address sharesSubject, uint256 amount) view returns (uint256)\",\n \"function getBuyPriceForFractionalShares(address sharesSubject, uint256 amount) view returns (uint256)\",\n \"function getSellPriceForFractionalShares(address sharesSubject, uint256 amount) view returns (uint256)\",\n \"function getMyFractionalShares(address sharesSubject, address user) view returns (uint256)\",\n \"function getSharesSupply(address sharesSubject) view returns (uint256)\",\n \"function getTotalFractionalSupply(address sharesSubject) view returns (uint256)\",\n \"function fractionalSharesBalance(address, address) view returns (uint256)\",\n \"function protocolFeePercent() view returns (uint256)\",\n \"function subjectFeePercent() view returns (uint256)\",\n \"function referralFeePercent() view returns (uint256)\",\n];\n","import { ethers, type JsonRpcProvider } from \"ethers\";\nimport {\n ARENA_TOKEN, ARENA_STAKING, WAVAX, LB_QUOTER,\n ERC20_ABI, ARENA_STAKING_ABI, LB_QUOTER_ABI, LB_ROUTER_ABI, LB_ROUTER,\n DEFAULT_SLIPPAGE_BPS, CHAIN_ID,\n} from \"../constants.js\";\nimport type { UnsignedTx } from \"../types.js\";\n\nexport class StakingModule {\n private arenaToken: ethers.Contract;\n private staking: ethers.Contract;\n\n constructor(private provider: JsonRpcProvider) {\n this.arenaToken = new ethers.Contract(ethers.getAddress(ARENA_TOKEN), ERC20_ABI, provider);\n this.staking = new ethers.Contract(ethers.getAddress(ARENA_STAKING), ARENA_STAKING_ABI, provider);\n }\n\n /** Get staking info — staked amount, pending rewards */\n async getInfo(wallet: string): Promise<{ staked: string; stakedFormatted: string; rewards: string; rewardsFormatted: string }> {\n const decimals = await this.arenaToken.decimals();\n const [stakedRaw] = await this.staking.getUserInfo(wallet, ethers.getAddress(ARENA_TOKEN));\n const pendingRaw = await this.staking.pendingReward(wallet, ethers.getAddress(ARENA_TOKEN));\n return {\n staked: stakedRaw.toString(),\n stakedFormatted: ethers.formatUnits(stakedRaw, decimals),\n rewards: pendingRaw.toString(),\n rewardsFormatted: ethers.formatUnits(pendingRaw, decimals),\n };\n }\n\n /** Build txs to stake ARENA: [approve, deposit] */\n async buildStake(wallet: string, amount: string): Promise<{ transactions: UnsignedTx[] }> {\n const decimals = await this.arenaToken.decimals();\n let stakeAmount: bigint;\n if (amount === \"max\") {\n stakeAmount = await this.arenaToken.balanceOf(wallet);\n } else {\n stakeAmount = ethers.parseUnits(amount, decimals);\n }\n\n const approveIface = new ethers.Interface(ERC20_ABI);\n const approveData = approveIface.encodeFunctionData(\"approve\", [ethers.getAddress(ARENA_STAKING), stakeAmount]);\n\n const stakingIface = new ethers.Interface(ARENA_STAKING_ABI);\n const stakeData = stakingIface.encodeFunctionData(\"deposit\", [stakeAmount]);\n\n return {\n transactions: [\n {\n to: ethers.getAddress(ARENA_TOKEN),\n data: approveData,\n value: \"0\",\n chainId: CHAIN_ID,\n gasLimit: \"60000\",\n description: `Approve ${ethers.formatUnits(stakeAmount, decimals)} ARENA for staking`,\n },\n {\n to: ethers.getAddress(ARENA_STAKING),\n data: stakeData,\n value: \"0\",\n chainId: CHAIN_ID,\n gasLimit: \"300000\",\n description: `Stake ${ethers.formatUnits(stakeAmount, decimals)} ARENA`,\n },\n ],\n };\n }\n\n /** Build tx to unstake ARENA + claim rewards */\n async buildUnstake(wallet: string, amount: string): Promise<{ transactions: UnsignedTx[] }> {\n const decimals = await this.arenaToken.decimals();\n let withdrawAmount: bigint;\n if (amount === \"max\") {\n const [stakedRaw] = await this.staking.getUserInfo(wallet, ethers.getAddress(ARENA_TOKEN));\n withdrawAmount = stakedRaw;\n } else {\n withdrawAmount = ethers.parseUnits(amount, decimals);\n }\n\n const iface = new ethers.Interface(ARENA_STAKING_ABI);\n const data = iface.encodeFunctionData(\"withdraw\", [withdrawAmount]);\n\n return {\n transactions: [{\n to: ethers.getAddress(ARENA_STAKING),\n data,\n value: \"0\",\n chainId: CHAIN_ID,\n gasLimit: \"300000\",\n description: `Unstake ${ethers.formatUnits(withdrawAmount, decimals)} ARENA + claim rewards`,\n }],\n };\n }\n\n /** Build buy-and-stake flow (3 txs): buy ARENA via LFJ, approve, stake */\n async buildBuyAndStake(wallet: string, avaxAmount: string, slippageBps = DEFAULT_SLIPPAGE_BPS): Promise<{ transactions: UnsignedTx[] }> {\n const lbQuoter = new ethers.Contract(ethers.getAddress(LB_QUOTER), LB_QUOTER_ABI, this.provider);\n const amountIn = ethers.parseEther(avaxAmount);\n const route = [WAVAX, ARENA_TOKEN];\n const quote = await lbQuoter.findBestPathFromAmountIn(route, amountIn);\n const expectedOut: bigint = quote.amounts[quote.amounts.length - 1];\n const clampedSlippage = BigInt(Math.max(0, Math.min(10000, Number(slippageBps))));\n const amountOutMin = expectedOut - (expectedOut * clampedSlippage) / 10000n;\n const deadline = Math.floor(Date.now() / 1000) + 3600;\n const decimals = await this.arenaToken.decimals();\n\n const path = {\n pairBinSteps: [...quote.binSteps].map((b: any) => b.toString()),\n versions: [...quote.versions].map((v: any) => Number(v)),\n tokenPath: [...route],\n };\n\n const routerIface = new ethers.Interface(LB_ROUTER_ABI);\n const buyData = routerIface.encodeFunctionData(\"swapExactNATIVEForTokens\", [amountOutMin, path, wallet, deadline]);\n\n const erc20Iface = new ethers.Interface(ERC20_ABI);\n const approveData = erc20Iface.encodeFunctionData(\"approve\", [ethers.getAddress(ARENA_STAKING), ethers.MaxUint256]);\n\n const stakingIface = new ethers.Interface(ARENA_STAKING_ABI);\n const stakeData = stakingIface.encodeFunctionData(\"deposit\", [expectedOut]);\n\n return {\n transactions: [\n {\n to: ethers.getAddress(LB_ROUTER),\n data: buyData,\n value: ethers.toBeHex(amountIn, 32),\n chainId: CHAIN_ID,\n gasLimit: \"500000\",\n description: `Step 1/3: Buy ~${ethers.formatUnits(expectedOut, decimals)} ARENA with ${avaxAmount} AVAX`,\n },\n {\n to: ethers.getAddress(ARENA_TOKEN),\n data: approveData,\n value: \"0\",\n chainId: CHAIN_ID,\n gasLimit: \"60000\",\n description: `Step 2/3: Approve ARENA for staking`,\n },\n {\n to: ethers.getAddress(ARENA_STAKING),\n data: stakeData,\n value: \"0\",\n chainId: CHAIN_ID,\n gasLimit: \"300000\",\n description: `Step 3/3: Stake ~${ethers.formatUnits(expectedOut, decimals)} ARENA`,\n },\n ],\n };\n }\n}\n","import { ethers, type JsonRpcProvider } from \"ethers\";\nimport {\n LAUNCH_CONTRACT, TOKEN_MANAGER, AVAX_HELPER,\n LAUNCH_CONTRACT_ABI, TOKEN_MANAGER_ABI, AVAX_HELPER_ABI,\n ERC20_ABI, ARENA_PAIRED_THRESHOLD, GRANULARITY_SCALER,\n DEFAULT_SLIPPAGE_BPS, CHAIN_ID,\n} from \"../constants.js\";\nimport type { UnsignedTx } from \"../types.js\";\n\nexport class LaunchpadModule {\n private launchContract: ethers.Contract;\n private tokenManager: ethers.Contract;\n private avaxHelper: ethers.Contract;\n\n constructor(private provider: JsonRpcProvider) {\n this.launchContract = new ethers.Contract(ethers.getAddress(LAUNCH_CONTRACT), LAUNCH_CONTRACT_ABI, provider);\n this.tokenManager = new ethers.Contract(ethers.getAddress(TOKEN_MANAGER), TOKEN_MANAGER_ABI, provider);\n this.avaxHelper = new ethers.Contract(ethers.getAddress(AVAX_HELPER), AVAX_HELPER_ABI, provider);\n }\n\n private isArenaPaired(tokenId: string): boolean { return BigInt(tokenId) >= ARENA_PAIRED_THRESHOLD; }\n private getContract(tokenId: string): ethers.Contract { return this.isArenaPaired(tokenId) ? this.tokenManager : this.launchContract; }\n\n /** Get platform overview — total tokens, fees, contract addresses */\n async getOverview() {\n const [avaxLatest, arenaLatest, protocolFeeAvax, protocolFeeArena] = await Promise.all([\n this.launchContract.tokenIdentifier(), this.tokenManager.tokenIdentifier(),\n this.launchContract.protocolFeeBasisPoint(), this.tokenManager.protocolFeeBasisPoint(),\n ]);\n return {\n totalAvaxPairedTokens: (avaxLatest - 1n).toString(),\n totalArenaPairedTokens: (arenaLatest - ARENA_PAIRED_THRESHOLD).toString(),\n totalTokens: ((avaxLatest - 1n) + (arenaLatest - ARENA_PAIRED_THRESHOLD)).toString(),\n protocolFeeBps: { avaxPaired: protocolFeeAvax.toString(), arenaPaired: protocolFeeArena.toString() },\n contracts: { launchContract: LAUNCH_CONTRACT, tokenManager: TOKEN_MANAGER, avaxHelper: AVAX_HELPER },\n };\n }\n\n /** Get full token info by ID */\n async getToken(tokenId: string) {\n const contract = this.getContract(tokenId);\n const id = BigInt(tokenId);\n const [params, supply, maxForSale] = await Promise.all([\n contract.getTokenParameters(id), contract.tokenSupply(id), contract.getMaxTokensForSale(id),\n ]);\n const tokenAddress = params.tokenContractAddress;\n if (tokenAddress === ethers.ZeroAddress) throw new Error(`Token ID ${tokenId} not found`);\n const token = new ethers.Contract(tokenAddress, ERC20_ABI, this.provider);\n let name = \"Unknown\", symbol = \"UNKNOWN\";\n try { [name, symbol] = await Promise.all([token.name(), token.symbol()]); } catch {}\n\n let priceAvax = \"0\";\n if (!params.lpDeployed) { try { const cost: bigint = await contract.calculateCostWithFees(1n, id); priceAvax = ethers.formatEther(cost); } catch {} }\n\n const salePerc = BigInt(params.salePercentage);\n const saleAllocation = (supply * salePerc) / 100n;\n const amountSold = saleAllocation > maxForSale ? saleAllocation - maxForSale : 0n;\n const graduationProgress = saleAllocation > 0n ? Number((amountSold * 10000n) / saleAllocation) / 100 : 0;\n\n return {\n tokenId, type: this.isArenaPaired(tokenId) ? \"ARENA-paired\" : \"AVAX-paired\",\n name, symbol, tokenAddress, creator: params.creatorAddress, priceAvax,\n graduationProgress: `${graduationProgress.toFixed(2)}%`, graduated: params.lpDeployed,\n amountSold: ethers.formatUnits(amountSold, 18), totalSupply: ethers.formatUnits(supply, 18),\n remainingForSale: ethers.formatUnits(maxForSale, 18),\n };\n }\n\n /** Get a buy or sell quote */\n async quote(tokenId: string, side: \"buy\" | \"sell\", amount: string) {\n const contract = this.getContract(tokenId);\n const id = BigInt(tokenId);\n if (side === \"buy\") {\n const avaxWei = ethers.parseEther(amount);\n if (!this.isArenaPaired(tokenId)) {\n const tokenAmountWei = await this.binarySearchTokenAmount(avaxWei, id);\n if (tokenAmountWei === 0n) return { tokenId, side, avaxIn: amount, tokensOut: \"0\", note: \"Insufficient liquidity\" };\n const exactCost: bigint = await this.launchContract.calculateCostWithFees(tokenAmountWei / GRANULARITY_SCALER, id);\n return { tokenId, side, avaxIn: ethers.formatEther(exactCost), tokensOut: ethers.formatUnits(tokenAmountWei, 18) };\n }\n return { tokenId, side, avaxIn: amount, tokensOut: \"determined at execution (ARENA-paired)\" };\n }\n const tokenAmountWei = ethers.parseUnits(amount, 18);\n const reward: bigint = await contract.calculateRewardWithFees(tokenAmountWei, id);\n return {\n tokenId, side, tokenAmount: amount,\n rewardAvax: this.isArenaPaired(tokenId) ? undefined : ethers.formatEther(reward),\n rewardArena: this.isArenaPaired(tokenId) ? ethers.formatUnits(reward, 18) : undefined,\n };\n }\n\n /** Get recent token launches */\n async getRecent(count = 10) {\n const results: any[] = [];\n const fetchToken = async (id: bigint, contract: ethers.Contract, pairType: string) => {\n try {\n const params = await contract.getTokenParameters(id);\n if (params.tokenContractAddress === ethers.ZeroAddress) return null;\n const token = new ethers.Contract(params.tokenContractAddress, ERC20_ABI, this.provider);\n let name = \"Unknown\", symbol = \"UNKNOWN\";\n try { [name, symbol] = await Promise.all([token.name(), token.symbol()]); } catch {}\n return { tokenId: id.toString(), type: pairType, name, symbol, tokenAddress: params.tokenContractAddress, graduated: params.lpDeployed };\n } catch { return null; }\n };\n const latestAvax: bigint = await this.launchContract.tokenIdentifier();\n const avaxPromises = [];\n for (let i = 0; i < Math.ceil(count / 2) && latestAvax - BigInt(i) > 0n; i++) {\n avaxPromises.push(fetchToken(latestAvax - BigInt(i) - 1n, this.launchContract, \"AVAX-paired\"));\n }\n const latestArena: bigint = await this.tokenManager.tokenIdentifier();\n const arenaPromises = [];\n for (let i = 0; i < Math.ceil(count / 2) && latestArena - BigInt(i) >= ARENA_PAIRED_THRESHOLD; i++) {\n arenaPromises.push(fetchToken(latestArena - BigInt(i) - 1n, this.tokenManager, \"ARENA-paired\"));\n }\n results.push(...(await Promise.all([...avaxPromises, ...arenaPromises])).filter(Boolean));\n return { count: results.length, tokens: results.slice(0, count) };\n }\n\n /** Build unsigned tx to buy a launchpad token */\n async buildBuy(wallet: string, tokenId: string, avax: string, slippageBps = DEFAULT_SLIPPAGE_BPS): Promise<{ transactions: UnsignedTx[] }> {\n const id = BigInt(tokenId);\n const avaxWei = ethers.parseEther(avax);\n const contract = this.getContract(tokenId);\n const params = await contract.getTokenParameters(id);\n if (params.lpDeployed) throw new Error(\"Token graduated to DEX — use dex.buildSwap() instead\");\n\n if (!this.isArenaPaired(tokenId)) {\n const tokenAmountWei = await this.binarySearchTokenAmount(avaxWei, id);\n if (tokenAmountWei === 0n) throw new Error(\"Cannot calculate buy amount — token may be sold out\");\n const iface = new ethers.Interface(LAUNCH_CONTRACT_ABI);\n const data = iface.encodeFunctionData(\"buyAndCreateLpIfPossible\", [tokenAmountWei, id]);\n return { transactions: [{ to: ethers.getAddress(LAUNCH_CONTRACT), data, value: ethers.toBeHex(avaxWei, 32), chainId: CHAIN_ID, gasLimit: \"500000\", description: `Buy ~${ethers.formatUnits(tokenAmountWei, 18)} tokens (ID ${tokenId})` }] };\n }\n const iface = new ethers.Interface(AVAX_HELPER_ABI);\n const data = iface.encodeFunctionData(\"buyAndCreateLpIfPossibleWithAvax\", [id, 0n]);\n return { transactions: [{ to: ethers.getAddress(AVAX_HELPER), data, value: ethers.toBeHex(avaxWei, 32), chainId: CHAIN_ID, gasLimit: \"500000\", description: `Buy tokens (ID ${tokenId}) with ${avax} AVAX` }] };\n }\n\n /** Build unsigned txs to sell a launchpad token: [approve, sell] */\n async buildSell(wallet: string, tokenId: string, amount: string, slippageBps = DEFAULT_SLIPPAGE_BPS): Promise<{ transactions: UnsignedTx[] }> {\n const id = BigInt(tokenId);\n const contract = this.getContract(tokenId);\n const params = await contract.getTokenParameters(id);\n if (params.lpDeployed) throw new Error(\"Token graduated to DEX — use dex.buildSwap() instead\");\n const tokenAddress = params.tokenContractAddress;\n if (tokenAddress === ethers.ZeroAddress) throw new Error(`Token ID ${tokenId} not found`);\n\n const token = new ethers.Contract(tokenAddress, ERC20_ABI, this.provider);\n let sellAmount: bigint;\n if (amount === \"max\") { sellAmount = await token.balanceOf(wallet); } else { sellAmount = ethers.parseUnits(amount, 18); }\n if (sellAmount === 0n) throw new Error(\"Zero balance\");\n\n if (!this.isArenaPaired(tokenId)) {\n sellAmount = (sellAmount / GRANULARITY_SCALER) * GRANULARITY_SCALER;\n if (sellAmount === 0n) throw new Error(\"Balance too small\");\n }\n\n const spender = this.isArenaPaired(tokenId) ? ethers.getAddress(AVAX_HELPER) : ethers.getAddress(LAUNCH_CONTRACT);\n const erc20Iface = new ethers.Interface(ERC20_ABI);\n const approveTx: UnsignedTx = { to: tokenAddress, data: erc20Iface.encodeFunctionData(\"approve\", [spender, ethers.MaxUint256]), value: \"0\", chainId: CHAIN_ID, gasLimit: \"60000\", description: \"Approve token for selling\" };\n\n let sellData: string; let sellTo: string;\n if (!this.isArenaPaired(tokenId)) {\n sellData = new ethers.Interface(LAUNCH_CONTRACT_ABI).encodeFunctionData(\"sell\", [sellAmount, id]);\n sellTo = ethers.getAddress(LAUNCH_CONTRACT);\n } else {\n let minOut = 0n;\n try { const reward: bigint = await contract.calculateRewardWithFees(sellAmount, id); minOut = reward - (reward * BigInt(slippageBps)) / 10000n; } catch {}\n sellData = new ethers.Interface(AVAX_HELPER_ABI).encodeFunctionData(\"sellToAvax\", [id, sellAmount, minOut]);\n sellTo = ethers.getAddress(AVAX_HELPER);\n }\n\n return { transactions: [approveTx, { to: sellTo, data: sellData, value: \"0\", chainId: CHAIN_ID, gasLimit: \"500000\", description: `Sell ${ethers.formatUnits(sellAmount, 18)} tokens (ID ${tokenId})` }] };\n }\n\n /** Binary search for max tokens purchasable with given AVAX */\n private async binarySearchTokenAmount(avaxBudgetWei: bigint, tokenId: bigint): Promise<bigint> {\n let maxForSale: bigint;\n try { maxForSale = await this.launchContract.getMaxTokensForSale(tokenId); } catch { maxForSale = 100_000_000n * GRANULARITY_SCALER; }\n const maxWhole = maxForSale / GRANULARITY_SCALER;\n if (maxWhole <= 0n) return 0n;\n let lo = 1n; let hi = maxWhole; let best = 0n;\n for (let i = 0; i < 30 && lo <= hi; i++) {\n const mid = (lo + hi) / 2n;\n try {\n const cost: bigint = await this.launchContract.calculateCostWithFees(mid, tokenId);\n if (cost <= avaxBudgetWei) { best = mid; lo = mid + 1n; } else { hi = mid - 1n; }\n } catch { hi = mid - 1n; }\n }\n return best > 0n ? best * GRANULARITY_SCALER : 0n;\n }\n}\n","import { ethers, type JsonRpcProvider } from \"ethers\";\nimport {\n WAVAX, LB_ROUTER, LB_QUOTER, ERC20_ABI, LB_ROUTER_ABI, LB_QUOTER_ABI,\n DEFAULT_SLIPPAGE_BPS, CHAIN_ID,\n} from \"../constants.js\";\nimport type { UnsignedTx } from \"../types.js\";\n\n/** Well-known tokens on Avalanche */\nconst KNOWN_TOKENS: Record<string, string> = {\n AVAX: WAVAX,\n WAVAX: WAVAX,\n USDC: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n \"USDC.e\": \"0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664\",\n USDT: \"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7\",\n \"USDT.e\": \"0xc7198437980c041c805A1EDcbA50c1Ce5db95118\",\n JOE: \"0x6e84a6216eA6dACC71eE8E6b0a5B7322EEbC0fDd\",\n ARENA: \"0xB8d7710f7d8349A506b75dD184F05777c82dAd0C\",\n \"BTC.b\": \"0x152b9d0FdC40C096DE20232Db5A0dF62B48dEeEB\",\n \"WETH.e\": \"0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB\",\n GMX: \"0x62edc0692BD897D2295872a9FFCac5425011c661\",\n sAVAX: \"0x2b2C81e08f1Af8835a78Bb2A90AE924ACE0eA4bE\",\n};\n\nexport class DexModule {\n private lbQuoter: ethers.Contract;\n\n constructor(private provider: JsonRpcProvider) {\n this.lbQuoter = new ethers.Contract(ethers.getAddress(LB_QUOTER), LB_QUOTER_ABI, provider);\n }\n\n /** Resolve token symbol or address to a checksummed address */\n private resolveToken(tokenOrAddress: string): string {\n const upper = tokenOrAddress.toUpperCase();\n if (KNOWN_TOKENS[upper]) return ethers.getAddress(KNOWN_TOKENS[upper]);\n if (KNOWN_TOKENS[tokenOrAddress]) return ethers.getAddress(KNOWN_TOKENS[tokenOrAddress]);\n if (tokenOrAddress.startsWith(\"0x\")) return ethers.getAddress(tokenOrAddress);\n throw new Error(`Unknown token: ${tokenOrAddress}. Use a symbol (AVAX, USDC, JOE, ARENA) or a 0x contract address.`);\n }\n\n /** List known tokens */\n getTokens(): { tokens: Array<{ symbol: string; address: string }>; note: string } {\n const tokens = Object.entries(KNOWN_TOKENS).map(([symbol, address]) => ({ symbol, address }));\n return { tokens, note: \"You can also pass any ERC-20 contract address directly.\" };\n }\n\n /** Look up any ERC-20 token by address */\n async getTokenInfo(address: string): Promise<{ address: string; symbol: string; name: string; decimals: number }> {\n const addr = ethers.getAddress(address);\n const token = new ethers.Contract(addr, ERC20_ABI, this.provider);\n const [name, symbol, decimals] = await Promise.all([token.name(), token.symbol(), token.decimals()]);\n return { address: addr, symbol, name, decimals: Number(decimals) };\n }\n\n /** Get balance of any token */\n async getBalance(wallet: string, tokenOrAddress: string): Promise<{ wallet: string; token: string; balance: string; formatted: string; symbol: string }> {\n const address = this.resolveToken(tokenOrAddress);\n if (address.toLowerCase() === WAVAX.toLowerCase() && tokenOrAddress.toUpperCase() === \"AVAX\") {\n const balance = await this.provider.getBalance(wallet);\n return { wallet, token: \"AVAX\", balance: balance.toString(), formatted: ethers.formatEther(balance), symbol: \"AVAX\" };\n }\n const token = new ethers.Contract(address, ERC20_ABI, this.provider);\n const [balance, symbol, decimals] = await Promise.all([token.balanceOf(wallet), token.symbol(), token.decimals()]);\n return { wallet, token: address, balance: balance.toString(), formatted: ethers.formatUnits(balance, decimals), symbol };\n }\n\n /** Quote a swap between any two tokens */\n async quote(from: string, to: string, amount: string): Promise<{ from: string; to: string; amountIn: string; amountOut: string; rate: string; path: string[] }> {\n const fromAddr = this.resolveToken(from);\n const toAddr = this.resolveToken(to);\n const fromToken = new ethers.Contract(fromAddr, ERC20_ABI, this.provider);\n const decimals = fromAddr.toLowerCase() === WAVAX.toLowerCase() ? 18 : Number(await fromToken.decimals());\n const amountIn = ethers.parseUnits(amount, decimals);\n\n const route = [fromAddr, toAddr];\n const quoteResult = await this.lbQuoter.findBestPathFromAmountIn(route, amountIn);\n const amountOut: bigint = quoteResult.amounts[quoteResult.amounts.length - 1];\n\n const toToken = new ethers.Contract(toAddr, ERC20_ABI, this.provider);\n const toDecimals = toAddr.toLowerCase() === WAVAX.toLowerCase() ? 18 : Number(await toToken.decimals());\n const outFormatted = ethers.formatUnits(amountOut, toDecimals);\n\n return {\n from, to, amountIn: amount, amountOut: outFormatted,\n rate: (parseFloat(outFormatted) / parseFloat(amount)).toFixed(6),\n path: route,\n };\n }\n\n /** Build swap transactions (1 tx for AVAX→token, 2 txs for token→token with approve) */\n async buildSwap(wallet: string, from: string, to: string, amount: string, slippageBps = DEFAULT_SLIPPAGE_BPS): Promise<{ transactions: UnsignedTx[]; summary: string }> {\n const fromAddr = this.resolveToken(from);\n const toAddr = this.resolveToken(to);\n const isFromNative = from.toUpperCase() === \"AVAX\";\n const isToNative = to.toUpperCase() === \"AVAX\";\n\n const fromToken = new ethers.Contract(fromAddr, ERC20_ABI, this.provider);\n const fromDecimals = isFromNative ? 18 : Number(await fromToken.decimals());\n\n let amountIn: bigint;\n if (amount === \"max\" && !isFromNative) {\n amountIn = await fromToken.balanceOf(wallet);\n if (amountIn === 0n) throw new Error(\"No balance to swap\");\n } else {\n amountIn = ethers.parseUnits(amount, fromDecimals);\n }\n\n const route = [fromAddr, toAddr];\n const quoteResult = await this.lbQuoter.findBestPathFromAmountIn(route, amountIn);\n const expectedOut: bigint = quoteResult.amounts[quoteResult.amounts.length - 1];\n if (expectedOut === 0n) throw new Error(\"Quote returned zero — no liquidity for this pair\");\n\n const clampedSlippage = BigInt(Math.max(0, Math.min(10000, Number(slippageBps))));\n const amountOutMin = expectedOut - (expectedOut * clampedSlippage) / 10000n;\n const deadline = Math.floor(Date.now() / 1000) + 3600;\n\n const path = {\n pairBinSteps: [...quoteResult.binSteps].map((b: any) => b.toString()),\n versions: [...quoteResult.versions].map((v: any) => Number(v)),\n tokenPath: [...route],\n };\n\n const txs: UnsignedTx[] = [];\n const routerIface = new ethers.Interface(LB_ROUTER_ABI);\n\n if (isFromNative) {\n const data = routerIface.encodeFunctionData(\"swapExactNATIVEForTokens\", [amountOutMin, path, wallet, deadline]);\n txs.push({ to: ethers.getAddress(LB_ROUTER), data, value: ethers.toBeHex(amountIn, 32), chainId: CHAIN_ID, gasLimit: \"500000\", description: `Swap ${amount} AVAX → ${to}` });\n } else if (isToNative) {\n const erc20Iface = new ethers.Interface(ERC20_ABI);\n txs.push({\n to: fromAddr, data: erc20Iface.encodeFunctionData(\"approve\", [ethers.getAddress(LB_ROUTER), amountIn]),\n value: \"0\", chainId: CHAIN_ID, gasLimit: \"60000\", description: `Approve ${from} for swap`,\n });\n const data = routerIface.encodeFunctionData(\"swapExactTokensForNATIVE\", [amountIn, amountOutMin, path, wallet, deadline]);\n txs.push({ to: ethers.getAddress(LB_ROUTER), data, value: \"0\", chainId: CHAIN_ID, gasLimit: \"500000\", description: `Swap ${from} → AVAX` });\n } else {\n // token→token: not directly supported by LB Router in a single hop, but we can try\n const erc20Iface = new ethers.Interface(ERC20_ABI);\n txs.push({\n to: fromAddr, data: erc20Iface.encodeFunctionData(\"approve\", [ethers.getAddress(LB_ROUTER), amountIn]),\n value: \"0\", chainId: CHAIN_ID, gasLimit: \"60000\", description: `Approve ${from} for swap`,\n });\n // For token→token, route through WAVAX\n throw new Error(\"Direct token→token swaps not yet supported. Route through AVAX: swap TOKEN→AVAX, then AVAX→TOKEN.\");\n }\n\n const toToken = new ethers.Contract(toAddr, ERC20_ABI, this.provider);\n const toDecimals = isToNative ? 18 : Number(await toToken.decimals());\n\n return { transactions: txs, summary: `Swap ${amount} ${from} → ~${ethers.formatUnits(expectedOut, toDecimals)} ${to}` };\n }\n}\n","import { ARENA_SOCIAL_API, HL_INFO } from \"../constants.js\";\n\nexport class PerpsModule {\n constructor(private arenaApiKey?: string) {}\n\n setArenaApiKey(key: string) { this.arenaApiKey = key; }\n\n private async arenaRequest(method: \"GET\" | \"POST\", path: string, body?: any, query?: Record<string, string>): Promise<any> {\n if (!this.arenaApiKey) throw new Error(\"Arena API key required for perps. Pass arenaApiKey in config.\");\n let url = `${ARENA_SOCIAL_API}${path}`;\n if (query) { const params = new URLSearchParams(query); url += `?${params.toString()}`; }\n const headers: Record<string, string> = { \"x-api-key\": this.arenaApiKey, \"Content-Type\": \"application/json\" };\n const res = await fetch(url, { method, headers, body: body ? JSON.stringify(body) : undefined });\n const data: any = await res.json();\n if (!res.ok) { throw new Error(data.message || data.error || `Arena perps error ${res.status}`); }\n return data;\n }\n\n private async hlPost(body: any): Promise<any> {\n const res = await fetch(HL_INFO, { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) });\n if (!res.ok) throw new Error(`Hyperliquid API error ${res.status}`);\n return res.json();\n }\n\n // ── Setup (via Arena API) ──\n\n async register() { return this.arenaRequest(\"POST\", \"/agents/perp/register\", { provider: \"HYPERLIQUID\" }); }\n async getRegistrationStatus() { return this.arenaRequest(\"GET\", \"/agents/perp/registration-status\", undefined, { provider: \"HYPERLIQUID\" }); }\n async getWalletAddress() { return this.arenaRequest(\"GET\", \"/agents/perp/wallet-address\", undefined, { provider: \"HYPERLIQUID\" }); }\n\n // ── Auth Flow (via Arena API — EIP-712 signing) ──\n\n async getAuthStatus() { return this.arenaRequest(\"POST\", \"/agents/perp/auth/status\", { provider: \"HYPERLIQUID\" }); }\n\n async getAuthPayload(step: string, mainWalletAddress?: string) {\n const body: any = { provider: \"HYPERLIQUID\" };\n if (mainWalletAddress) body.mainWalletAddress = mainWalletAddress;\n return this.arenaRequest(\"POST\", `/agents/perp/auth/${step}/payload`, body);\n }\n\n async submitAuthSignature(step: string, signature: string, mainWalletAddress?: string, metadata?: any) {\n return this.arenaRequest(\"POST\", `/agents/perp/auth/${step}/submit`, { provider: \"HYPERLIQUID\", mainWalletAddress, signature, metadata });\n }\n\n async enableHip3() { return this.arenaRequest(\"POST\", \"/agents/perp/auth/enable-hip3\", { provider: \"HYPERLIQUID\" }); }\n\n // ── Market Data (direct Hyperliquid) ──\n\n async getTradingPairs(): Promise<{ pairs: any[]; count: number }> {\n const raw = await this.hlPost({ type: \"metaAndAssetCtxs\" });\n const universe = raw[0].universe;\n const pairs = universe.map((m: any, i: number) => ({\n name: m.name, symbol: m.name, baseAssetId: i,\n sizePrecision: m.szDecimals, maxLeverage: m.maxLeverage,\n isDelisted: false, marginMode: m.onlyIsolated ? \"isolated\" : \"cross\",\n }));\n return { pairs, count: pairs.length };\n }\n\n // ── Trading (via Arena API — they hold the signing keys) ──\n\n async updateLeverage(symbol: string, leverage: number, leverageType: \"cross\" | \"isolated\" = \"cross\") {\n return this.arenaRequest(\"POST\", \"/agents/perp/leverage/update\", { provider: \"HYPERLIQUID\", symbol, leverage, leverageType });\n }\n\n async placeOrder(orders: any[]) {\n return this.arenaRequest(\"POST\", \"/agents/perp/orders/place\", { provider: \"HYPERLIQUID\", orders });\n }\n\n async cancelOrders(cancels: { assetIndex: number; oid: number }[]) {\n return this.arenaRequest(\"POST\", \"/agents/perp/orders/cancel\", { provider: \"HYPERLIQUID\", cancels });\n }\n\n async closePosition(symbol: string, positionSide: \"long\" | \"short\", size: number, currentPrice: number, closePercent = 100) {\n return this.arenaRequest(\"POST\", \"/agents/perp/orders/close-position\", { provider: \"HYPERLIQUID\", symbol, positionSide, size, currentPrice, closePercent });\n }\n\n async getOrders() { return this.arenaRequest(\"GET\", \"/agents/perp/orders\", undefined, { provider: \"HYPERLIQUID\" }); }\n async getTradeExecutions() { return this.arenaRequest(\"GET\", \"/agents/perp/trade-executions\", undefined, { provider: \"HYPERLIQUID\" }); }\n\n // ── Positions (direct Hyperliquid — read-only, no auth needed) ──\n\n async getPositions(wallet: string): Promise<any> {\n return this.hlPost({ type: \"clearinghouseState\", user: wallet });\n }\n\n async getOpenOrders(wallet: string): Promise<any> {\n return this.hlPost({ type: \"openOrders\", user: wallet });\n }\n}\n","import { LIFI_API } from \"../constants.js\";\n\nexport interface BridgeQuoteResponse {\n id: string;\n fromChainId: number;\n toChainId: number;\n fromToken: string;\n toToken: string;\n fromAmount: string;\n toAmount: string;\n estimatedGas: string;\n estimatedTime: number;\n tool: string;\n transaction?: { to: string; data: string; value: string; gasLimit?: string; chainId: number };\n}\n\nexport interface BridgeStatusResponse {\n status: \"NOT_FOUND\" | \"PENDING\" | \"DONE\" | \"FAILED\";\n substatus?: string;\n receiving?: { txHash: string; amount: string; token: string; chainId: number };\n}\n\nexport interface BridgeLiFiToken { address: string; symbol: string; decimals: number; name: string; priceUSD?: string; chainId: number; }\nexport interface BridgeLiFiChain { id: number; key: string; name: string; chainType: string; nativeToken?: { symbol: string; decimals: number; address: string }; }\n\nexport const BRIDGE_CHAINS = {\n ethereum: 1, base: 8453, arbitrum: 42161, optimism: 10, polygon: 137,\n bsc: 56, avalanche: 43114, fantom: 250, gnosis: 100, zksync: 324,\n linea: 59144, scroll: 534352, blast: 81457, mantle: 5000,\n} as const;\n\nexport const USDC: Record<string, string> = {\n \"1\": \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n \"42161\": \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n \"43114\": \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n \"8453\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"10\": \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n \"137\": \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n};\n\nexport const NATIVE_TOKEN = \"0x0000000000000000000000000000000000000000\";\n\nexport class BridgeModule {\n async getChains(): Promise<{ chains: BridgeLiFiChain[]; count: number }> {\n const res = await fetch(`${LIFI_API}/chains`);\n if (!res.ok) throw new Error(`Li.Fi chains failed (${res.status})`);\n const data: any = await res.json();\n return { chains: data.chains, count: data.chains.length };\n }\n\n async getTokens(chains: string): Promise<{ tokens: Record<string, BridgeLiFiToken[]> }> {\n const res = await fetch(`${LIFI_API}/tokens?chains=${chains}`);\n if (!res.ok) throw new Error(`Li.Fi tokens failed (${res.status})`);\n const data: any = await res.json();\n return { tokens: data.tokens };\n }\n\n async getToken(chainId: number, address: string): Promise<BridgeLiFiToken> {\n const res = await fetch(`${LIFI_API}/token?chain=${chainId}&token=${address}`);\n if (!res.ok) throw new Error(`Li.Fi token failed (${res.status})`);\n return (await res.json()) as BridgeLiFiToken;\n }\n\n async getConnections(fromChainId: number, toChainId: number, fromToken?: string, toToken?: string): Promise<{ connections: any[] }> {\n const params = new URLSearchParams({ fromChain: fromChainId.toString(), toChain: toChainId.toString() });\n if (fromToken) params.set(\"fromToken\", fromToken);\n if (toToken) params.set(\"toToken\", toToken);\n const res = await fetch(`${LIFI_API}/connections?${params}`);\n if (!res.ok) throw new Error(`Li.Fi connections failed (${res.status})`);\n const data: any = await res.json();\n return { connections: data.connections };\n }\n\n async getQuote(\n fromChainId: number, toChainId: number, fromToken: string, toToken: string,\n fromAmount: string, fromAddress: string, toAddress?: string, slippage?: number, fromDecimals?: number,\n ): Promise<BridgeQuoteResponse> {\n const decimals = fromDecimals ?? 18;\n const amountWei = this.parseUnits(fromAmount, decimals);\n const params = new URLSearchParams({\n fromChain: fromChainId.toString(), toChain: toChainId.toString(),\n fromToken, toToken, fromAmount: amountWei, fromAddress,\n toAddress: toAddress ?? fromAddress, slippage: (slippage ?? 0.03).toString(),\n integrator: \"logiqical\",\n });\n const res = await fetch(`${LIFI_API}/quote?${params}`);\n if (!res.ok) { const body = await res.text().catch(() => \"\"); throw new Error(`Li.Fi quote failed (${res.status}): ${body}`); }\n return this.parseQuote(await res.json());\n }\n\n async getRoutes(\n fromChainId: number, toChainId: number, fromToken: string, toToken: string,\n fromAmount: string, fromAddress: string, toAddress?: string, slippage?: number, fromDecimals?: number,\n ): Promise<{ routes: BridgeQuoteResponse[]; count: number }> {\n const decimals = fromDecimals ?? 18;\n const amountWei = this.parseUnits(fromAmount, decimals);\n const body = {\n fromChainId, toChainId, fromTokenAddress: fromToken, toTokenAddress: toToken,\n fromAmount: amountWei, fromAddress, toAddress: toAddress ?? fromAddress,\n options: { slippage: slippage ?? 0.03, integrator: \"logiqical\", order: \"RECOMMENDED\" },\n };\n const res = await fetch(`${LIFI_API}/advanced/routes`, { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) });\n if (!res.ok) { const b = await res.text().catch(() => \"\"); throw new Error(`Li.Fi routes failed (${res.status}): ${b}`); }\n const data: any = await res.json();\n const routes = (data.routes ?? []).map((r: any) => this.parseRoute(r));\n return { routes, count: routes.length };\n }\n\n async getStatus(txHash: string, fromChainId: number, toChainId: number, bridge?: string): Promise<BridgeStatusResponse> {\n const params = new URLSearchParams({ txHash, fromChain: fromChainId.toString(), toChain: toChainId.toString() });\n if (bridge) params.set(\"bridge\", bridge);\n const res = await fetch(`${LIFI_API}/status?${params}`);\n if (!res.ok) throw new Error(`Li.Fi status failed (${res.status})`);\n return (await res.json()) as BridgeStatusResponse;\n }\n\n getInfo() {\n return { chains: BRIDGE_CHAINS, usdc: USDC, nativeToken: NATIVE_TOKEN, tip: \"Use 0x0000...0000 for native tokens\" };\n }\n\n private parseUnits(amount: string, decimals: number): string {\n const parts = amount.split(\".\");\n const whole = parts[0] || \"0\";\n const frac = (parts[1] || \"\").slice(0, decimals).padEnd(decimals, \"0\");\n return (BigInt(whole) * (BigInt(10) ** BigInt(decimals)) + BigInt(frac)).toString();\n }\n\n private parseQuote(data: any): BridgeQuoteResponse {\n const action = data.action ?? {};\n const estimate = data.estimate ?? {};\n const txReq = data.transactionRequest;\n const quote: BridgeQuoteResponse = {\n id: data.id ?? data.tool ?? \"unknown\", fromChainId: action.fromChainId ?? 0, toChainId: action.toChainId ?? 0,\n fromToken: action.fromToken?.address ?? \"\", toToken: action.toToken?.address ?? \"\",\n fromAmount: action.fromAmount ?? \"0\", toAmount: estimate.toAmount ?? \"0\",\n estimatedGas: estimate.gasCosts?.[0]?.amountUSD ?? \"0\", estimatedTime: estimate.executionDuration ?? 0,\n tool: data.tool ?? \"unknown\",\n };\n if (txReq) {\n quote.transaction = { to: txReq.to, data: txReq.data, value: txReq.value ?? \"0x0\", gasLimit: txReq.gasLimit, chainId: txReq.chainId ?? action.fromChainId };\n }\n return quote;\n }\n\n private parseRoute(route: any): BridgeQuoteResponse {\n const steps = route.steps ?? [];\n const firstStep = steps[0] ?? {};\n const action = firstStep.action ?? {};\n const estimate = firstStep.estimate ?? {};\n return {\n id: route.id ?? \"unknown\", fromChainId: route.fromChainId ?? 0, toChainId: route.toChainId ?? 0,\n fromToken: route.fromToken?.address ?? \"\", toToken: route.toToken?.address ?? \"\",\n fromAmount: route.fromAmount ?? \"0\", toAmount: route.toAmount ?? \"0\",\n estimatedGas: route.gasCostUSD ?? \"0\",\n estimatedTime: steps.reduce((t: number, s: any) => t + (s.estimate?.executionDuration ?? 0), 0),\n tool: firstStep.tool ?? \"unknown\",\n };\n }\n}\n","import { ethers, type JsonRpcProvider } from \"ethers\";\nimport { ARENA_SHARES_CONTRACT, SHARES_ABI, FRACTION_SCALER, CHAIN_ID } from \"../constants.js\";\nimport type { UnsignedTx } from \"../types.js\";\n\nexport interface TicketPriceResponse { price: string; priceWithFee?: string; priceAfterFee?: string; tickets: string; fractionalAmount: number; }\nexport interface TicketBalanceResponse { tickets: string; fractionalAmount: string; }\nexport interface TicketSupplyResponse { wholeSupply: string; fractionalSupply: string; tickets: string; }\nexport interface TicketFeesResponse { protocolFee: string; subjectFee: string; referralFee: string; totalFeePercent: string; }\n\nexport class TicketsModule {\n private contract: ethers.Contract;\n\n constructor(private provider: JsonRpcProvider) {\n this.contract = new ethers.Contract(ethers.getAddress(ARENA_SHARES_CONTRACT), SHARES_ABI, provider);\n }\n\n async getBuyPrice(subject: string, amount = \"1\"): Promise<TicketPriceResponse> {\n const fractionalAmount = this.ticketsToFractional(amount);\n const subjectAddr = ethers.getAddress(subject);\n const [price, priceWithFee] = await Promise.all([\n this.contract.getBuyPriceForFractionalShares(subjectAddr, fractionalAmount),\n this.contract.getBuyPriceForFractionalSharesAfterFee(subjectAddr, fractionalAmount),\n ]);\n return { price: ethers.formatEther(price), priceWithFee: ethers.formatEther(priceWithFee), tickets: amount, fractionalAmount };\n }\n\n async getSellPrice(subject: string, amount = \"1\"): Promise<TicketPriceResponse> {\n const fractionalAmount = this.ticketsToFractional(amount);\n const subjectAddr = ethers.getAddress(subject);\n const [price, priceAfterFee] = await Promise.all([\n this.contract.getSellPriceForFractionalShares(subjectAddr, fractionalAmount),\n this.contract.getSellPriceForFractionalSharesAfterFee(subjectAddr, fractionalAmount),\n ]);\n return { price: ethers.formatEther(price), priceAfterFee: ethers.formatEther(priceAfterFee), tickets: amount, fractionalAmount };\n }\n\n async getBalance(subject: string, user: string): Promise<TicketBalanceResponse> {\n const frac: bigint = await this.contract.getMyFractionalShares(ethers.getAddress(subject), ethers.getAddress(user));\n return { tickets: (Number(frac) / FRACTION_SCALER).toString(), fractionalAmount: frac.toString() };\n }\n\n async getSupply(subject: string): Promise<TicketSupplyResponse> {\n const subjectAddr = ethers.getAddress(subject);\n const [wholeSupply, fracSupply] = await Promise.all([\n this.contract.getSharesSupply(subjectAddr),\n this.contract.getTotalFractionalSupply(subjectAddr),\n ]);\n return { wholeSupply: wholeSupply.toString(), fractionalSupply: fracSupply.toString(), tickets: (Number(fracSupply) / FRACTION_SCALER).toString() };\n }\n\n async getFees(): Promise<TicketFeesResponse> {\n const [protocol, subject, referral] = await Promise.all([\n this.contract.protocolFeePercent(),\n this.contract.subjectFeePercent(),\n this.contract.referralFeePercent(),\n ]);\n const toPercent = (v: bigint) => (Number(v) / 1e16).toFixed(1) + \"%\";\n return { protocolFee: toPercent(protocol), subjectFee: toPercent(subject), referralFee: toPercent(referral), totalFeePercent: toPercent(protocol + subject + referral) };\n }\n\n async buildBuyTx(wallet: string, subject: string, amount = \"1\"): Promise<{ transaction: UnsignedTx }> {\n const fractionalAmount = this.ticketsToFractional(amount);\n const subjectAddr = ethers.getAddress(subject);\n const userAddr = ethers.getAddress(wallet);\n const cost: bigint = await this.contract.getBuyPriceForFractionalSharesAfterFee(subjectAddr, fractionalAmount);\n if (cost === 0n) throw new Error(\"Could not get buy price — subject may not exist\");\n\n const iface = new ethers.Interface(SHARES_ABI);\n const data = iface.encodeFunctionData(\"buyFractionalShares\", [subjectAddr, userAddr, fractionalAmount]);\n\n return {\n transaction: {\n to: ethers.getAddress(ARENA_SHARES_CONTRACT),\n data,\n value: ethers.toBeHex(cost, 32),\n chainId: CHAIN_ID,\n gasLimit: \"200000\",\n description: `Buy ${amount} ticket(s) for ~${ethers.formatEther(cost)} AVAX`,\n },\n };\n }\n\n async buildSellTx(wallet: string, subject: string, amount = \"1\"): Promise<{ transaction: UnsignedTx }> {\n const fractionalAmount = this.ticketsToFractional(amount);\n const subjectAddr = ethers.getAddress(subject);\n const userAddr = ethers.getAddress(wallet);\n\n const balance: bigint = await this.contract.getMyFractionalShares(subjectAddr, userAddr);\n if (balance < BigInt(fractionalAmount)) {\n throw new Error(`Insufficient tickets: have ${(Number(balance) / FRACTION_SCALER)}, trying to sell ${amount}`);\n }\n\n const proceeds: bigint = await this.contract.getSellPriceForFractionalSharesAfterFee(subjectAddr, fractionalAmount);\n const iface = new ethers.Interface(SHARES_ABI);\n const data = iface.encodeFunctionData(\"sellFractionalShares\", [subjectAddr, userAddr, fractionalAmount]);\n\n return {\n transaction: {\n to: ethers.getAddress(ARENA_SHARES_CONTRACT),\n data,\n value: \"0x0\",\n chainId: CHAIN_ID,\n gasLimit: \"200000\",\n description: `Sell ${amount} ticket(s) for ~${ethers.formatEther(proceeds)} AVAX`,\n },\n };\n }\n\n private ticketsToFractional(tickets: string): number {\n const num = parseFloat(tickets);\n if (isNaN(num) || num <= 0) throw new Error(`Invalid ticket amount: ${tickets}`);\n return Math.round(num * FRACTION_SCALER);\n }\n}\n","import { ARENA_SOCIAL_API } from \"../constants.js\";\n\nexport class SocialModule {\n constructor(private arenaApiKey?: string) {}\n\n setArenaApiKey(key: string) { this.arenaApiKey = key; }\n\n private async request(method: \"GET\" | \"POST\" | \"PATCH\", path: string, body?: any, query?: Record<string, string>): Promise<any> {\n if (!this.arenaApiKey) throw new Error(\"Arena API key required for social endpoints. Pass arenaApiKey in config.\");\n let url = `${ARENA_SOCIAL_API}${path}`;\n if (query) { const params = new URLSearchParams(query); url += `?${params.toString()}`; }\n const headers: Record<string, string> = { \"x-api-key\": this.arenaApiKey, \"Content-Type\": \"application/json\" };\n const res = await fetch(url, { method, headers, body: body ? JSON.stringify(body) : undefined });\n const data: any = await res.json();\n if (!res.ok) { const msg = data.message || data.error || `Arena API error ${res.status}`; throw new Error(msg); }\n return data;\n }\n\n // ── User Discovery ──\n async searchUsers(q: string, page = 1, pageSize = 20) { return this.request(\"GET\", \"/agents/user/search\", undefined, { searchString: q, page: String(page), pageSize: String(pageSize) }); }\n async getUserByHandle(handle: string) { return this.request(\"GET\", \"/agents/user/handle\", undefined, { handle }); }\n async getUserById(userId: string) { return this.request(\"GET\", \"/agents/user/id\", undefined, { userId }); }\n async getTopUsers(page = 1, pageSize = 20) { return this.request(\"GET\", \"/agents/user/top\", undefined, { page: String(page), pageSize: String(pageSize) }); }\n async getMe() { return this.request(\"GET\", \"/agents/user/me\"); }\n\n // ── Profile ──\n async updateProfile(updates: { userName?: string; bio?: string; profilePicture?: string }) { return this.request(\"PATCH\", \"/agents/user/profile\", updates); }\n async updateBanner(bannerUrl: string) { return this.request(\"POST\", \"/agents/profile/banner\", { bannerUrl }); }\n\n // ── Follow ──\n async follow(userId: string) { return this.request(\"POST\", \"/agents/follow/follow\", { userId }); }\n async unfollow(userId: string) { return this.request(\"POST\", \"/agents/follow/unfollow\", { userId }); }\n async getFollowers(userId: string, page = 1, pageSize = 20) { return this.request(\"GET\", \"/agents/follow/followers/list\", undefined, { followersOfUserId: userId, pageNumber: String(page), pageSize: String(pageSize) }); }\n async getFollowing(userId: string, page = 1, pageSize = 20) { return this.request(\"GET\", \"/agents/follow/following/list\", undefined, { followingUserId: userId, pageNumber: String(page), pageSize: String(pageSize) }); }\n\n // ── Shares ──\n async getSharesStats(userId: string) { return this.request(\"GET\", \"/agents/shares/stats\", undefined, { userId }); }\n async getShareHolders(userId?: string, page = 1, pageSize = 20) { const q: Record<string, string> = { page: String(page), pageSize: String(pageSize) }; if (userId) q.userId = userId; return this.request(\"GET\", \"/agents/shares/holders\", undefined, q); }\n async getHoldings(page = 1, pageSize = 20) { return this.request(\"GET\", \"/agents/shares/holdings\", undefined, { page: String(page), pageSize: String(pageSize) }); }\n\n // ── Chat: Conversations ──\n async getConversations(page = 1) { return this.request(\"GET\", \"/agents/chat/conversations\", undefined, { page: String(page), pageSize: \"20\" }); }\n async getDirectMessages() { return this.request(\"GET\", \"/agents/chat/direct-messages\", undefined, { page: \"1\", pageSize: \"20\" }); }\n async getGroupChats() { return this.request(\"GET\", \"/agents/chat/project-chats\", undefined, { page: \"1\", pageSize: \"20\" }); }\n async getGroup(groupId: string) { return this.request(\"GET\", \"/agents/chat/group\", undefined, { groupId }); }\n async getMembers(groupId: string) { return this.request(\"GET\", \"/agents/chat/members\", undefined, { groupId, page: \"1\", pageSize: \"20\" }); }\n async getOrCreateDM(userId: string) { return this.request(\"GET\", \"/agents/chat/group/by/user\", undefined, { userId }); }\n async acceptChat(groupId: string) { return this.request(\"GET\", \"/agents/chat/accept-chat\", undefined, { groupId }); }\n\n // ── Chat: Messages ──\n async sendMessage(groupId: string, text: string, replyId?: string) { const body: any = { groupId, text, files: [] }; if (replyId) body.replyId = replyId; return this.request(\"POST\", \"/agents/chat/message\", body); }\n async getMessages(groupId: string, after?: string) { const q: Record<string, string> = { groupId }; if (after) q.timeFrom = after; return this.request(\"GET\", \"/agents/chat/messages/a\", undefined, q); }\n async searchMessages(q: string, groupId?: string) { const query: Record<string, string> = { searchQuery: q, limit: \"20\" }; if (groupId) query.groupId = groupId; return this.request(\"GET\", \"/agents/chat/messages/search\", undefined, query); }\n async getMentions(groupId?: string) { const q: Record<string, string> = { limit: \"50\" }; if (groupId) q.groupId = groupId; return this.request(\"GET\", \"/agents/chat/messages/mentions\", undefined, q); }\n\n // ── Chat: Reactions & Pins ──\n async react(messageId: string, groupId: string, reaction: string) { return this.request(\"POST\", \"/agents/chat/react\", { messageId, groupId, reaction }); }\n async pinMessage(messageId: string, groupId: string, isPinned = true) { return this.request(\"POST\", \"/agents/chat/message/pin\", { messageId, groupId, isPinned }); }\n async getPinnedMessages(groupId: string) { return this.request(\"GET\", `/agents/chat/messages/pinned/${groupId}`); }\n\n // ── Threads ──\n async createThread(content: string, replyToId?: string) { const body: any = { content }; if (replyToId) body.replyToId = replyToId; return this.request(\"POST\", \"/agents/threads\", body); }\n async likeThread(threadId: string) { return this.request(\"POST\", \"/agents/threads/like\", { threadId }); }\n async repost(threadId: string) { return this.request(\"POST\", \"/agents/threads/repost\", { threadId }); }\n}\n","import { HL_INFO } from \"../constants.js\";\n\ninterface HlAssetCtx { coin: string; markPx: string; midPx: string; oraclePx: string; openInterest: string; funding: string; premium: string; dayNtlVlm: string; prevDayPx: string; }\ninterface HlMeta { name: string; szDecimals: number; maxLeverage: number; }\n\nexport interface MarketSignal {\n coin: string; price: number; oraclePrice: number; change24h: number; change24hPct: number;\n volume24h: number; openInterest: number; fundingRate: number; fundingAnnualized: number;\n fundingBias: \"long-heavy\" | \"short-heavy\" | \"neutral\"; maxLeverage: number;\n}\n\nexport interface TechnicalSignal {\n coin: string; price: number; sma20: number; sma50: number; rsi14: number;\n trend: \"bullish\" | \"bearish\" | \"neutral\"; momentum: \"strong\" | \"moderate\" | \"weak\";\n priceVsSma20: number; priceVsSma50: number; volatility: number; support: number; resistance: number;\n}\n\nexport interface SignalSummary {\n coin: string; timestamp: string; market: MarketSignal; technical: TechnicalSignal;\n whaleActivity: { topLongs: any[]; topShorts: any[]; netBias: \"long\" | \"short\" | \"neutral\"; largestPosition: any | null };\n verdict: { direction: \"long\" | \"short\" | \"wait\"; confidence: \"high\" | \"medium\" | \"low\"; reasons: string[] };\n}\n\nexport class SignalsModule {\n private assetCache: { data: any; ts: number } | null = null;\n private candleCache: Map<string, { data: number[][]; ts: number }> = new Map();\n\n private async hlPost(body: any): Promise<any> {\n const res = await fetch(HL_INFO, { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) });\n if (!res.ok) throw new Error(`Hyperliquid API error ${res.status}`);\n return res.json();\n }\n\n /** Get all asset contexts (cached 10s) */\n async getAssetContexts(): Promise<{ meta: HlMeta[]; contexts: HlAssetCtx[] }> {\n if (this.assetCache && Date.now() - this.assetCache.ts < 10_000) return this.assetCache.data;\n const raw = await this.hlPost({ type: \"metaAndAssetCtxs\" });\n const result = { meta: raw[0].universe as HlMeta[], contexts: raw[1] as HlAssetCtx[] };\n this.assetCache = { data: result, ts: Date.now() };\n return result;\n }\n\n /** Get market signal for a specific asset */\n async getMarketSignal(coin: string): Promise<MarketSignal> {\n const { meta, contexts } = await this.getAssetContexts();\n const idx = meta.findIndex((m) => m.name.toUpperCase() === coin.toUpperCase());\n if (idx === -1) throw new Error(`Asset ${coin} not found on Hyperliquid`);\n const m = meta[idx]; const ctx = contexts[idx];\n const price = parseFloat(ctx.markPx); const prevPrice = parseFloat(ctx.prevDayPx);\n const funding = parseFloat(ctx.funding);\n const change24h = price - prevPrice;\n const change24hPct = prevPrice > 0 ? (change24h / prevPrice) * 100 : 0;\n let fundingBias: \"long-heavy\" | \"short-heavy\" | \"neutral\" = \"neutral\";\n if (funding > 0.0001) fundingBias = \"long-heavy\"; else if (funding < -0.0001) fundingBias = \"short-heavy\";\n return {\n coin: m.name, price, oraclePrice: parseFloat(ctx.oraclePx), change24h,\n change24hPct: Math.round(change24hPct * 100) / 100, volume24h: Math.round(parseFloat(ctx.dayNtlVlm)),\n openInterest: Math.round(parseFloat(ctx.openInterest)), fundingRate: funding,\n fundingAnnualized: Math.round(funding * 8760 * 10000) / 100, fundingBias, maxLeverage: m.maxLeverage,\n };\n }\n\n /** Get funding rate extremes across all markets */\n async getFundingExtremes(count = 10): Promise<{ mostPositive: MarketSignal[]; mostNegative: MarketSignal[] }> {\n const { meta, contexts } = await this.getAssetContexts();\n const signals = meta.map((m, i) => this.buildSignal(m, contexts[i]));\n const sorted = [...signals].sort((a, b) => b.fundingRate - a.fundingRate);\n return { mostPositive: sorted.slice(0, count), mostNegative: sorted.slice(-count).reverse() };\n }\n\n /** Get candle data for technical analysis (cached 60s) */\n async getCandles(coin: string, interval = \"1h\", count = 100): Promise<number[][]> {\n const cacheKey = `${coin}-${interval}`;\n const cached = this.candleCache.get(cacheKey);\n if (cached && Date.now() - cached.ts < 60_000) return cached.data.slice(-count);\n const startTime = Date.now() - count * this.intervalToMs(interval);\n const data = await this.hlPost({ type: \"candleSnapshot\", req: { coin: coin.toUpperCase(), interval, startTime, endTime: Date.now() } });\n const candles = data.map((c: any) => [c.t, parseFloat(c.o), parseFloat(c.h), parseFloat(c.l), parseFloat(c.c), parseFloat(c.v)]);\n this.candleCache.set(cacheKey, { data: candles, ts: Date.now() });\n return candles.slice(-count);\n }\n\n /** Compute technical signals from candle data */\n async getTechnicalSignal(coin: string, interval = \"1h\"): Promise<TechnicalSignal> {\n const candles = await this.getCandles(coin, interval, 100);\n const closes = candles.map((c) => c[4]);\n const highs = candles.map((c) => c[2]);\n const lows = candles.map((c) => c[3]);\n const price = closes[closes.length - 1];\n const sma20 = this.sma(closes, 20); const sma50 = this.sma(closes, 50); const rsi14 = this.rsi(closes, 14);\n let trend: \"bullish\" | \"bearish\" | \"neutral\" = \"neutral\";\n if (price > sma20 && price > sma50) trend = \"bullish\"; else if (price < sma20 && price < sma50) trend = \"bearish\";\n let momentum: \"strong\" | \"moderate\" | \"weak\" = \"moderate\";\n if (rsi14 > 70 || rsi14 < 30) momentum = \"strong\"; else if (rsi14 > 60 || rsi14 < 40) momentum = \"moderate\"; else momentum = \"weak\";\n const returns = closes.slice(-21).map((c, i, arr) => i === 0 ? 0 : (c - arr[i - 1]) / arr[i - 1]); returns.shift();\n const volatility = Math.sqrt(returns.reduce((sum, r) => sum + r * r, 0) / returns.length) * 100;\n const resistance = Math.max(...highs.slice(-20)); const support = Math.min(...lows.slice(-20));\n return {\n coin: coin.toUpperCase(), price, sma20: Math.round(sma20 * 100) / 100, sma50: Math.round(sma50 * 100) / 100,\n rsi14: Math.round(rsi14 * 100) / 100, trend, momentum,\n priceVsSma20: Math.round(((price - sma20) / sma20) * 10000) / 100,\n priceVsSma50: Math.round(((price - sma50) / sma50) * 10000) / 100,\n volatility: Math.round(volatility * 100) / 100, support: Math.round(support * 100) / 100, resistance: Math.round(resistance * 100) / 100,\n };\n }\n\n /** Get whale positions from orderbook depth */\n async getWhalePositions(coin: string, minPositionUsd = 100_000): Promise<any[]> {\n const book = await this.hlPost({ type: \"l2Book\", coin: coin.toUpperCase() });\n const whales: any[] = [];\n for (const level of book.levels[0] ?? []) {\n const px = parseFloat(level.px); const sz = parseFloat(level.sz); const value = px * sz;\n if (value >= minPositionUsd) whales.push({ coin: coin.toUpperCase(), size: sz, entryPrice: px, side: \"long\", positionValue: Math.round(value) });\n }\n for (const level of book.levels[1] ?? []) {\n const px = parseFloat(level.px); const sz = parseFloat(level.sz); const value = px * sz;\n if (value >= minPositionUsd) whales.push({ coin: coin.toUpperCase(), size: sz, entryPrice: px, side: \"short\", positionValue: Math.round(value) });\n }\n return whales.sort((a, b) => b.positionValue - a.positionValue);\n }\n\n /** Full signal summary — everything an agent needs to decide */\n async summary(coin: string): Promise<SignalSummary> {\n const [market, technical, whalePositions] = await Promise.all([\n this.getMarketSignal(coin), this.getTechnicalSignal(coin), this.getWhalePositions(coin),\n ]);\n const topLongs = whalePositions.filter((w) => w.side === \"long\").slice(0, 5);\n const topShorts = whalePositions.filter((w) => w.side === \"short\").slice(0, 5);\n const longValue = topLongs.reduce((s: number, w: any) => s + w.positionValue, 0);\n const shortValue = topShorts.reduce((s: number, w: any) => s + w.positionValue, 0);\n let netBias: \"long\" | \"short\" | \"neutral\" = \"neutral\";\n if (longValue > shortValue * 1.3) netBias = \"long\"; else if (shortValue > longValue * 1.3) netBias = \"short\";\n\n const reasons: string[] = []; let longScore = 0; let shortScore = 0;\n if (technical.trend === \"bullish\") { longScore += 2; reasons.push(\"Price above SMA20 & SMA50 (bullish trend)\"); }\n else if (technical.trend === \"bearish\") { shortScore += 2; reasons.push(\"Price below SMA20 & SMA50 (bearish trend)\"); }\n if (technical.rsi14 < 30) { longScore += 2; reasons.push(`RSI ${technical.rsi14} — oversold`); }\n else if (technical.rsi14 > 70) { shortScore += 2; reasons.push(`RSI ${technical.rsi14} — overbought`); }\n if (market.fundingBias === \"long-heavy\") { shortScore += 1; reasons.push(\"Crowded long — contrarian short signal\"); }\n else if (market.fundingBias === \"short-heavy\") { longScore += 1; reasons.push(\"Crowded short — contrarian long signal\"); }\n if (netBias === \"long\") { longScore += 1; reasons.push(\"Whale bias: more large bids\"); }\n else if (netBias === \"short\") { shortScore += 1; reasons.push(\"Whale bias: more large asks\"); }\n if (market.change24hPct > 3) { longScore += 1; reasons.push(`+${market.change24hPct}% momentum`); }\n else if (market.change24hPct < -3) { shortScore += 1; reasons.push(`${market.change24hPct}% selling`); }\n\n const diff = Math.abs(longScore - shortScore);\n let direction: \"long\" | \"short\" | \"wait\" = \"wait\";\n let confidence: \"high\" | \"medium\" | \"low\" = \"low\";\n if (diff >= 4) { direction = longScore > shortScore ? \"long\" : \"short\"; confidence = \"high\"; }\n else if (diff >= 2) { direction = longScore > shortScore ? \"long\" : \"short\"; confidence = \"medium\"; }\n else { reasons.push(\"Mixed signals — wait for better setup.\"); }\n\n return {\n coin: coin.toUpperCase(), timestamp: new Date().toISOString(), market, technical,\n whaleActivity: { topLongs, topShorts, netBias, largestPosition: whalePositions[0] ?? null },\n verdict: { direction, confidence, reasons },\n };\n }\n\n /** Scan for top trading opportunities */\n async scan(count = 5): Promise<SignalSummary[]> {\n const [movers, funding] = await Promise.all([this.getTopMovers(10), this.getFundingExtremes(10)]);\n const candidates = new Set<string>([\"BTC\", \"ETH\", \"SOL\"]);\n movers.gainers.slice(0, 3).forEach((s) => candidates.add(s.coin));\n movers.losers.slice(0, 3).forEach((s) => candidates.add(s.coin));\n funding.mostPositive.slice(0, 2).forEach((s) => candidates.add(s.coin));\n funding.mostNegative.slice(0, 2).forEach((s) => candidates.add(s.coin));\n const summaries = await Promise.all(Array.from(candidates).slice(0, 15).map((c) => this.summary(c).catch(() => null)));\n const valid = summaries.filter((s): s is SignalSummary => s !== null && s.verdict.direction !== \"wait\");\n const order = { high: 3, medium: 2, low: 1 };\n valid.sort((a, b) => order[b.verdict.confidence] - order[a.verdict.confidence]);\n return valid.slice(0, count);\n }\n\n private async getTopMovers(count: number) {\n const { meta, contexts } = await this.getAssetContexts();\n const signals = meta.map((m, i) => this.buildSignal(m, contexts[i]));\n const sorted = [...signals].sort((a, b) => b.change24hPct - a.change24hPct);\n return { gainers: sorted.slice(0, count), losers: sorted.slice(-count).reverse() };\n }\n\n private buildSignal(m: HlMeta, ctx: HlAssetCtx): MarketSignal {\n const price = parseFloat(ctx.markPx); const prevPrice = parseFloat(ctx.prevDayPx); const funding = parseFloat(ctx.funding);\n const change24hPct = prevPrice > 0 ? ((price - prevPrice) / prevPrice) * 100 : 0;\n let fundingBias: \"long-heavy\" | \"short-heavy\" | \"neutral\" = \"neutral\";\n if (funding > 0.0001) fundingBias = \"long-heavy\"; else if (funding < -0.0001) fundingBias = \"short-heavy\";\n return {\n coin: m.name, price, oraclePrice: parseFloat(ctx.oraclePx), change24h: price - prevPrice,\n change24hPct: Math.round(change24hPct * 100) / 100, volume24h: Math.round(parseFloat(ctx.dayNtlVlm)),\n openInterest: Math.round(parseFloat(ctx.openInterest)), fundingRate: funding,\n fundingAnnualized: Math.round(funding * 8760 * 10000) / 100, fundingBias, maxLeverage: m.maxLeverage,\n };\n }\n\n private sma(data: number[], period: number): number { const s = data.slice(-period); return s.reduce((sum, v) => sum + v, 0) / s.length; }\n private rsi(closes: number[], period: number): number {\n const changes = closes.slice(-period - 1).map((c, i, arr) => i === 0 ? 0 : c - arr[i - 1]); changes.shift();\n let avgGain = 0; let avgLoss = 0;\n for (const ch of changes) { if (ch > 0) avgGain += ch; else avgLoss += Math.abs(ch); }\n avgGain /= period; avgLoss /= period;\n if (avgLoss === 0) return 100;\n return 100 - 100 / (1 + avgGain / avgLoss);\n }\n private intervalToMs(interval: string): number {\n const map: Record<string, number> = { \"1m\": 60_000, \"5m\": 300_000, \"15m\": 900_000, \"1h\": 3_600_000, \"4h\": 14_400_000, \"1d\": 86_400_000 };\n return map[interval] ?? 3_600_000;\n }\n}\n","const COINGECKO_API = \"https://api.coingecko.com/api/v3\";\n\nexport interface PriceData { [coinId: string]: { usd: number; usd_24h_change?: number; usd_market_cap?: number; usd_24h_vol?: number } }\nexport interface TrendingCoin { id: string; name: string; symbol: string; market_cap_rank: number; thumb: string; price_btc: number }\nexport interface MarketEntry { id: string; symbol: string; name: string; current_price: number; market_cap: number; price_change_percentage_24h: number; total_volume: number; market_cap_rank: number }\n\nexport class MarketModule {\n /** Get prices for one or more coins (by CoinGecko ID) */\n async price(ids: string | string[]): Promise<PriceData> {\n const idStr = Array.isArray(ids) ? ids.join(\",\") : ids;\n const res = await fetch(`${COINGECKO_API}/simple/price?ids=${idStr}&vs_currencies=usd&include_24hr_change=true&include_market_cap=true&include_24hr_vol=true`);\n if (!res.ok) throw new Error(`CoinGecko price error ${res.status}`);\n return res.json() as Promise<PriceData>;\n }\n\n /** Get trending coins */\n async trending(): Promise<{ coins: TrendingCoin[] }> {\n const res = await fetch(`${COINGECKO_API}/search/trending`);\n if (!res.ok) throw new Error(`CoinGecko trending error ${res.status}`);\n const data: any = await res.json();\n const coins = (data.coins ?? []).map((c: any) => ({\n id: c.item.id, name: c.item.name, symbol: c.item.symbol,\n market_cap_rank: c.item.market_cap_rank, thumb: c.item.thumb, price_btc: c.item.price_btc,\n }));\n return { coins };\n }\n\n /** Get top coins by market cap */\n async markets(count = 20, page = 1): Promise<{ coins: MarketEntry[] }> {\n const res = await fetch(`${COINGECKO_API}/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=${count}&page=${page}&sparkline=false`);\n if (!res.ok) throw new Error(`CoinGecko markets error ${res.status}`);\n const data: any = await res.json();\n const coins = data.map((c: any) => ({\n id: c.id, symbol: c.symbol, name: c.name, current_price: c.current_price,\n market_cap: c.market_cap, price_change_percentage_24h: c.price_change_percentage_24h,\n total_volume: c.total_volume, market_cap_rank: c.market_cap_rank,\n }));\n return { coins };\n }\n\n /** Search for coins by query */\n async search(query: string): Promise<{ coins: Array<{ id: string; name: string; symbol: string; market_cap_rank: number }> }> {\n const res = await fetch(`${COINGECKO_API}/search?query=${encodeURIComponent(query)}`);\n if (!res.ok) throw new Error(`CoinGecko search error ${res.status}`);\n const data: any = await res.json();\n return { coins: (data.coins ?? []).map((c: any) => ({ id: c.id, name: c.name, symbol: c.symbol, market_cap_rank: c.market_cap_rank })) };\n }\n\n /** Get AVAX price specifically */\n async avaxPrice(): Promise<{ usd: number; change24h: number }> {\n const data = await this.price(\"avalanche-2\");\n const avax = data[\"avalanche-2\"];\n return { usd: avax?.usd ?? 0, change24h: avax?.usd_24h_change ?? 0 };\n }\n\n /** Get ARENA price specifically */\n async arenaPrice(): Promise<{ usd: number; change24h: number }> {\n const data = await this.price(\"arena-social\");\n const arena = data[\"arena-social\"];\n return { usd: arena?.usd ?? 0, change24h: arena?.usd_24h_change ?? 0 };\n }\n}\n","import { ethers, type JsonRpcProvider } from \"ethers\";\nimport { CHAIN_ID } from \"../constants.js\";\nimport type { UnsignedTx } from \"../types.js\";\n\n// ── sAVAX (Benqi Liquid Staking) ──\n\nconst SAVAX_ADDRESS = \"0x2b2C81e08f1Af8835a78Bb2A90AE924ACE0eA4bE\";\nconst SAVAX_ABI = [\n \"function submit() payable returns (uint256)\",\n \"function requestUnlock(uint256 shareAmount) returns (uint256)\",\n \"function getPooledAvaxByShares(uint256 shareAmount) view returns (uint256)\",\n \"function getSharesByPooledAvax(uint256 avaxAmount) view returns (uint256)\",\n \"function totalPooledAvax() view returns (uint256)\",\n \"function totalShares() view returns (uint256)\",\n \"function balanceOf(address) view returns (uint256)\",\n \"function cooldownPeriod() view returns (uint256)\",\n \"function exchangeRate() view returns (uint256)\",\n \"function approve(address,uint256) returns (bool)\",\n];\n\n// ── ERC-4626 Vault ABI ──\n\nconst VAULT_ABI = [\n \"function asset() view returns (address)\",\n \"function totalAssets() view returns (uint256)\",\n \"function totalSupply() view returns (uint256)\",\n \"function balanceOf(address) view returns (uint256)\",\n \"function convertToShares(uint256 assets) view returns (uint256)\",\n \"function convertToAssets(uint256 shares) view returns (uint256)\",\n \"function maxDeposit(address) view returns (uint256)\",\n \"function maxWithdraw(address) view returns (uint256)\",\n \"function previewDeposit(uint256 assets) view returns (uint256)\",\n \"function previewWithdraw(uint256 assets) view returns (uint256)\",\n \"function deposit(uint256 assets, address receiver) returns (uint256)\",\n \"function withdraw(uint256 assets, address receiver, address owner) returns (uint256)\",\n \"function decimals() view returns (uint8)\",\n \"function symbol() view returns (string)\",\n \"function name() view returns (string)\",\n];\n\nconst ERC20_ABI = [\n \"function balanceOf(address) view returns (uint256)\",\n \"function approve(address,uint256) returns (bool)\",\n \"function allowance(address,address) view returns (uint256)\",\n \"function decimals() view returns (uint8)\",\n \"function symbol() view returns (string)\",\n];\n\nexport class DefiModule {\n private savax: ethers.Contract;\n\n constructor(private provider: JsonRpcProvider) {\n this.savax = new ethers.Contract(ethers.getAddress(SAVAX_ADDRESS), SAVAX_ABI, provider);\n }\n\n // ── sAVAX Liquid Staking ──\n\n /** Get sAVAX staking info: exchange rate, total staked, your balance */\n async sAvaxInfo(wallet?: string): Promise<{\n exchangeRate: string; totalPooledAvax: string; totalShares: string;\n balance?: string; balanceInAvax?: string;\n }> {\n const [totalPooled, totalShares] = await Promise.all([\n this.savax.totalPooledAvax(),\n this.savax.totalShares(),\n ]);\n const exchangeRate = totalShares > 0n\n ? ethers.formatEther((totalPooled * ethers.parseEther(\"1\")) / totalShares)\n : \"1.0\";\n\n const result: any = {\n exchangeRate,\n totalPooledAvax: ethers.formatEther(totalPooled),\n totalShares: ethers.formatEther(totalShares),\n };\n\n if (wallet) {\n const balance: bigint = await this.savax.balanceOf(wallet);\n const avaxValue: bigint = await this.savax.getPooledAvaxByShares(balance);\n result.balance = ethers.formatEther(balance);\n result.balanceInAvax = ethers.formatEther(avaxValue);\n }\n return result;\n }\n\n /** Quote: how much sAVAX for staking AVAX */\n async sAvaxStakeQuote(avaxAmount: string): Promise<{ avaxIn: string; savaxOut: string }> {\n const avaxWei = ethers.parseEther(avaxAmount);\n const shares: bigint = await this.savax.getSharesByPooledAvax(avaxWei);\n return { avaxIn: avaxAmount, savaxOut: ethers.formatEther(shares) };\n }\n\n /** Build tx to stake AVAX → sAVAX */\n async buildSAvaxStake(avaxAmount: string): Promise<{ transactions: UnsignedTx[] }> {\n const avaxWei = ethers.parseEther(avaxAmount);\n const iface = new ethers.Interface(SAVAX_ABI);\n const data = iface.encodeFunctionData(\"submit\", []);\n return {\n transactions: [{\n to: ethers.getAddress(SAVAX_ADDRESS),\n data,\n value: ethers.toBeHex(avaxWei, 32),\n chainId: CHAIN_ID,\n gasLimit: \"300000\",\n description: `Stake ${avaxAmount} AVAX → sAVAX`,\n }],\n };\n }\n\n /** Build tx to request unstake sAVAX → AVAX (delayed) */\n async buildSAvaxUnstake(wallet: string, amount: string): Promise<{ transactions: UnsignedTx[] }> {\n let shareAmount: bigint;\n if (amount === \"max\") {\n shareAmount = await this.savax.balanceOf(wallet);\n } else {\n shareAmount = ethers.parseEther(amount);\n }\n if (shareAmount === 0n) throw new Error(\"Zero sAVAX balance\");\n\n const iface = new ethers.Interface(SAVAX_ABI);\n const data = iface.encodeFunctionData(\"requestUnlock\", [shareAmount]);\n return {\n transactions: [{\n to: ethers.getAddress(SAVAX_ADDRESS),\n data,\n value: \"0\",\n chainId: CHAIN_ID,\n gasLimit: \"300000\",\n description: `Request unstake ${ethers.formatEther(shareAmount)} sAVAX`,\n }],\n };\n }\n\n // ── ERC-4626 Vaults ──\n\n /** Get info about any ERC-4626 vault */\n async vaultInfo(vaultAddress: string, wallet?: string): Promise<{\n name: string; symbol: string; asset: string; totalAssets: string;\n totalSupply: string; sharePrice: string;\n userShares?: string; userAssets?: string;\n }> {\n const vault = new ethers.Contract(ethers.getAddress(vaultAddress), VAULT_ABI, this.provider);\n const [name, symbol, asset, totalAssets, totalSupply, decimals] = await Promise.all([\n vault.name(), vault.symbol(), vault.asset(),\n vault.totalAssets(), vault.totalSupply(), vault.decimals(),\n ]);\n\n const sharePrice = totalSupply > 0n\n ? ethers.formatUnits((totalAssets * (10n ** BigInt(decimals))) / totalSupply, decimals)\n : \"1.0\";\n\n const result: any = {\n name, symbol, asset,\n totalAssets: ethers.formatUnits(totalAssets, decimals),\n totalSupply: ethers.formatUnits(totalSupply, decimals),\n sharePrice,\n };\n\n if (wallet) {\n const shares: bigint = await vault.balanceOf(wallet);\n const assets: bigint = shares > 0n ? await vault.convertToAssets(shares) : 0n;\n result.userShares = ethers.formatUnits(shares, decimals);\n result.userAssets = ethers.formatUnits(assets, decimals);\n }\n return result;\n }\n\n /** Quote vault deposit — how many shares for given assets */\n async vaultDepositQuote(vaultAddress: string, amount: string): Promise<{ assetsIn: string; sharesOut: string }> {\n const vault = new ethers.Contract(ethers.getAddress(vaultAddress), VAULT_ABI, this.provider);\n const decimals = Number(await vault.decimals());\n const assetsWei = ethers.parseUnits(amount, decimals);\n const shares: bigint = await vault.previewDeposit(assetsWei);\n return { assetsIn: amount, sharesOut: ethers.formatUnits(shares, decimals) };\n }\n\n /** Build txs to deposit into an ERC-4626 vault: [approve, deposit] */\n async buildVaultDeposit(wallet: string, vaultAddress: string, amount: string): Promise<{ transactions: UnsignedTx[] }> {\n const vaultAddr = ethers.getAddress(vaultAddress);\n const vault = new ethers.Contract(vaultAddr, VAULT_ABI, this.provider);\n const assetAddr: string = await vault.asset();\n const assetToken = new ethers.Contract(assetAddr, ERC20_ABI, this.provider);\n const decimals = Number(await assetToken.decimals());\n\n let depositAmount: bigint;\n if (amount === \"max\") {\n depositAmount = await assetToken.balanceOf(wallet);\n } else {\n depositAmount = ethers.parseUnits(amount, decimals);\n }\n if (depositAmount === 0n) throw new Error(\"Zero balance to deposit\");\n\n const erc20Iface = new ethers.Interface(ERC20_ABI);\n const approveData = erc20Iface.encodeFunctionData(\"approve\", [vaultAddr, depositAmount]);\n const vaultIface = new ethers.Interface(VAULT_ABI);\n const depositData = vaultIface.encodeFunctionData(\"deposit\", [depositAmount, wallet]);\n\n return {\n transactions: [\n { to: assetAddr, data: approveData, value: \"0\", chainId: CHAIN_ID, gasLimit: \"60000\", description: `Approve asset for vault deposit` },\n { to: vaultAddr, data: depositData, value: \"0\", chainId: CHAIN_ID, gasLimit: \"300000\", description: `Deposit ${ethers.formatUnits(depositAmount, decimals)} into vault` },\n ],\n };\n }\n\n /** Build tx to withdraw from an ERC-4626 vault */\n async buildVaultWithdraw(wallet: string, vaultAddress: string, amount: string): Promise<{ transactions: UnsignedTx[] }> {\n const vaultAddr = ethers.getAddress(vaultAddress);\n const vault = new ethers.Contract(vaultAddr, VAULT_ABI, this.provider);\n const decimals = Number(await vault.decimals());\n\n let withdrawAmount: bigint;\n if (amount === \"max\") {\n const shares: bigint = await vault.balanceOf(wallet);\n withdrawAmount = await vault.convertToAssets(shares);\n } else {\n withdrawAmount = ethers.parseUnits(amount, decimals);\n }\n if (withdrawAmount === 0n) throw new Error(\"Nothing to withdraw\");\n\n const iface = new ethers.Interface(VAULT_ABI);\n const data = iface.encodeFunctionData(\"withdraw\", [withdrawAmount, wallet, wallet]);\n\n return {\n transactions: [{\n to: vaultAddr, data, value: \"0\", chainId: CHAIN_ID, gasLimit: \"300000\",\n description: `Withdraw ${ethers.formatUnits(withdrawAmount, decimals)} from vault`,\n }],\n };\n }\n}\n","export type LogiqicalErrorCode =\n | \"INSUFFICIENT_BALANCE\"\n | \"SLIPPAGE_EXCEEDED\"\n | \"TOKEN_NOT_FOUND\"\n | \"CONTRACT_REVERT\"\n | \"NO_LIQUIDITY\"\n | \"TX_FAILED\"\n | \"INVALID_ADDRESS\"\n | \"INVALID_AMOUNT\"\n | \"NO_WALLET\"\n | \"NETWORK_ERROR\"\n | \"API_ERROR\"\n | \"UNKNOWN\";\n\nexport class LogiqicalError extends Error {\n constructor(\n message: string,\n public readonly code: LogiqicalErrorCode,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = \"LogiqicalError\";\n }\n\n static from(e: unknown, code: LogiqicalErrorCode = \"UNKNOWN\"): LogiqicalError {\n if (e instanceof LogiqicalError) return e;\n const cause = e instanceof Error ? e : new Error(String(e));\n return new LogiqicalError(cause.message, code, cause);\n }\n}\n"],"mappings":"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","names":["ethers","JsonRpcProvider","ethers","ethers","ethers","ethers","ethers","ethers","tokenAmountWei","iface","data","ethers","ethers","balance","ethers","ethers","m","ethers","ERC20_ABI","ethers","ethers","JsonRpcProvider"]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "logiqical",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Agent wallet SDK for Avalanche — swap, stake, launchpad, DEX, perps, bridge, social, signals. No backend needed.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"logiqical-mcp": "./dist/cli.mjs"
|
|
10
|
+
},
|
|
8
11
|
"exports": {
|
|
9
12
|
".": {
|
|
10
13
|
"types": "./dist/index.d.ts",
|
|
@@ -16,8 +19,8 @@
|
|
|
16
19
|
"dist"
|
|
17
20
|
],
|
|
18
21
|
"scripts": {
|
|
19
|
-
"build": "tsup
|
|
20
|
-
"dev": "tsup
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"dev": "tsup --watch",
|
|
21
24
|
"prepublishOnly": "npm run build"
|
|
22
25
|
},
|
|
23
26
|
"keywords": [
|
|
@@ -27,19 +30,26 @@
|
|
|
27
30
|
"sdk",
|
|
28
31
|
"ai-agent",
|
|
29
32
|
"trading",
|
|
30
|
-
"logiqical"
|
|
33
|
+
"logiqical",
|
|
34
|
+
"wallet",
|
|
35
|
+
"agent-wallet",
|
|
36
|
+
"signals",
|
|
37
|
+
"perps",
|
|
38
|
+
"bridge",
|
|
39
|
+
"mcp"
|
|
31
40
|
],
|
|
32
41
|
"license": "MIT",
|
|
33
|
-
"repository": {
|
|
34
|
-
"type": "git",
|
|
35
|
-
"url": "https://github.com/OlaCryto/arena-agent-plugin.git",
|
|
36
|
-
"directory": "sdk"
|
|
37
|
-
},
|
|
42
|
+
"repository": {},
|
|
38
43
|
"engines": {
|
|
39
44
|
"node": ">=18.0.0"
|
|
40
45
|
},
|
|
41
46
|
"devDependencies": {
|
|
42
47
|
"tsup": "^8.0.0",
|
|
43
48
|
"typescript": "^5.3.0"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
52
|
+
"ethers": "^6.16.0",
|
|
53
|
+
"zod": "^3.24.4"
|
|
44
54
|
}
|
|
45
55
|
}
|