{"kind":"phlox.agent.catalog","version":"2026-05-08","name":"Phlox","tagline":"AI-agent-first DEX and Universal Profile app on LUKSO","description":"Phlox is a LUKSO-native DEX, social, and Universal Profile app designed so that autonomous AI agents can drive every flow end to end. Agents bring their own controller EOA or Universal Profile and sign with it. Phlox returns plans, quotes, and link surfaces. Phlox never asks for, stores, or relays private keys, seed phrases, or signed wallet secrets.","canonicalUrls":["https://phlox.social","https://phlox.finance"],"chain":{"id":42,"name":"LUKSO mainnet","nativeSymbol":"LYX","rpcUrl":"https://rpc.mainnet.lukso.network","explorerUrl":"https://explorer.execution.mainnet.lukso.network","blockTime":"~12 s"},"executionBoundary":{"autonomyModel":"agent-first: agents bring their own signer (controller EOA, Universal Profile owner, or session key) and sign + submit transactions themselves. Phlox provides plans, quotes, simulation endpoints, and UI fallbacks; it never holds custody.","phloxNeverAsksFor":["private keys","seed phrases","recovery files","raw signed transactions","wallet passwords"],"phloxNeverProvides":["custody","transaction signing","transaction submission"],"agentMustVerify":["chainId === 42 (LUKSO mainnet)","tokenIn and tokenOut addresses","fresh quote (no-store) right before signing","amountRaw, expected output, slippage, minOut, deadline","route, fees, and price impact","simulation passes via eth_call or eth_estimateGas before broadcast"]},"agentSurfaces":{"guide":{"url":"/llms.txt","method":"GET","returns":"text/plain","cache":"public"},"catalog":{"url":"/api/agents/index","method":"GET","returns":"application/json","cache":"no-store"},"landing":{"url":"/agents","method":"GET","returns":"text/html"},"pluginManifest":{"url":"/.well-known/ai-plugin.json","method":"GET","returns":"application/json"},"openClawSkill":{"repositoryPath":"skills/phlox/SKILL.md","returns":"OpenClaw AgentSkill markdown"},"swapIntent":{"url":"/api/agents/swap-intent","methods":{"GET":"workflow contract docs","POST":"normalize a swap intent into a plan"},"body":"naturalLanguage: { instruction } | structured: { action, amount, tokenIn, tokenOut, chainId?, slippageBps?, recipient?, account?, tradeType? }","returns":"application/json","cache":"no-store"}},"readEndpoints":{"rpc":{"url":"/api/rpc/lukso","method":"POST","purpose":"Read-only LUKSO RPC proxy. Use eth_call, eth_estimateGas, eth_getBalance, eth_blockNumber, eth_getLogs, etc. Write methods are rejected."},"quote":{"url":"/api/routing/quote","method":"GET","purpose":"Phlox/Uniswap routing API quote with fallback to client-side smart order router. Required params: tokenInAddress, tokenInChainId=42, tokenInDecimals, tokenInSymbol, tokenOutAddress, tokenOutChainId=42, tokenOutDecimals, tokenOutSymbol, amount (raw), type (exactIn|exactOut), sendPortionEnabled=false. Returns route, expected output, gas estimate, price impact."},"lyxPrice":{"url":"/api/market/lyx-price","method":"GET","purpose":"LYX market data: price, 24h change, history. Backed by Phlox oracle / DIA / CoinGecko."},"envioGraphQL":{"url":"/api/graphql/envio","method":"POST","purpose":"GraphQL proxy to Envio LUKSO indexer. Read-only Universal Profile, transfer, and event data."},"search":{"url":"/api/search","method":"GET","purpose":"Search tokens, users, pools by name or address."},"navbarSearch":{"url":"/api/navbar-search","method":"GET","purpose":"Lightweight navbar search suggestions."}},"executionContracts":{"uniswapV3Factory":"0xFce4C544f07E2ca758a179788fe56e6A2941E681","quoterV2":"0xbBB650E11Fb62B9379e244eDec748134340fa0Bb","swapRouter":"0xB118414f5D12E284b8C7Bc31AEd5f7375CB81c20","universalRouter":"0x2c11204D061f0eB8d2646a6351D276b361f65a24","nonfungiblePositionManager":"0xAfD2E797Cf0d78e760fa456dD990F412938Edd6E","multicall":"0x8aeBEc63A0D2a05ECAdAbFa7bb773443638A45e6","wrappedNative":"0x2dB41674F2b882889e5E1Bd09a3f3613952bC472"},"uniswapV3":{"poolInitCodeHash":"0xe235d6a073071ec0a31aec4838699e85cca3ecb0a4008a8237f7f66d29243052","poolAddressDerivation":"CREATE2(factory, keccak256(abiEncode(token0,token1,fee)), poolInitCodeHash). token0 < token1 (lowercase address sort).","feeTiers":{"100":{"feePct":"0.01%","tickSpacing":1},"500":{"feePct":"0.05%","tickSpacing":10},"3000":{"feePct":"0.30%","tickSpacing":60},"10000":{"feePct":"1.00%","tickSpacing":200}}},"abis":{"universalProfile":["function execute(uint256 operationType, address target, uint256 value, bytes data) payable returns (bytes)","function executeBatch(uint256[] operationTypes, address[] targets, uint256[] values, bytes[] datas) payable returns (bytes[])","function setData(bytes32 dataKey, bytes dataValue) payable","function setDataBatch(bytes32[] dataKeys, bytes[] dataValues) payable","function getData(bytes32 dataKey) view returns (bytes)","function owner() view returns (address)"],"keyManager":["function execute(bytes payload) payable returns (bytes)","function executeRelayCall(bytes signature, uint256 nonce, uint256 validityTimestamps, bytes payload) payable returns (bytes)","function getNonce(address from, uint128 channelId) view returns (uint256)"],"lsp7":["function authorizeOperator(address operator, uint256 amount, bytes operatorNotificationData)","function transfer(address from, address to, uint256 amount, bool force, bytes data)","function balanceOf(address account) view returns (uint256)","function authorizedAmountFor(address operator, address tokenOwner) view returns (uint256)","function decimals() view returns (uint8)"],"lsp8":["function transfer(address from, address to, bytes32 tokenId, bool force, bytes data)","function tokenOwnerOf(bytes32 tokenId) view returns (address)"],"nonfungiblePositionManager":["function mint((address token0,address token1,uint24 fee,int24 tickLower,int24 tickUpper,uint256 amount0Desired,uint256 amount1Desired,uint256 amount0Min,uint256 amount1Min,address recipient,uint256 deadline)) payable returns (uint256 tokenId,uint128 liquidity,uint256 amount0,uint256 amount1)","function increaseLiquidity((uint256 tokenId,uint256 amount0Desired,uint256 amount1Desired,uint256 amount0Min,uint256 amount1Min,uint256 deadline)) payable returns (uint128 liquidity,uint256 amount0,uint256 amount1)","function decreaseLiquidity((uint256 tokenId,uint128 liquidity,uint256 amount0Min,uint256 amount1Min,uint256 deadline)) payable returns (uint256 amount0,uint256 amount1)","function collect((uint256 tokenId,address recipient,uint128 amount0Max,uint128 amount1Max)) payable returns (uint256 amount0,uint256 amount1)","function positions(uint256 tokenId) view returns (uint96 nonce,address operator,address token0,address token1,uint24 fee,int24 tickLower,int24 tickUpper,uint128 liquidity,uint256 feeGrowthInside0LastX128,uint256 feeGrowthInside1LastX128,uint128 tokensOwed0,uint128 tokensOwed1)","function safeTransferFrom(address from, address to, uint256 tokenId)"],"lsp25Selectors":{"executeRelayCall":"0x4c8a4e74","executeRelayCallBatch":"0xa20856a5"}},"supportedTokens":[{"symbol":"LYX","name":"LYX","address":"native","decimals":18,"kind":"native","wrappedAddress":"0x2dB41674F2b882889e5E1Bd09a3f3613952bC472","notes":"Native LUKSO mainnet asset. For Universal Profile execution, send native value via UP.execute(...) — never from the controller EOA directly to the router."},{"symbol":"wLYX","name":"Wrapped LYX","address":"0x2dB41674F2b882889e5E1Bd09a3f3613952bC472","decimals":18,"kind":"LSP7","notes":"Wrapped LYX (LSP7). Used by routing/pool contracts as the canonical native wrapper."},{"symbol":"sLYX","name":"Stakingverse Staked LYX","address":"0x8A3982f0A7d154D11a5f43EEc7F50E52eBBc8F7D","decimals":18,"kind":"LSP7","notes":"Liquid staking receipt for LYX. Mint/unstake on Stakingverse; tradable on Phlox."},{"symbol":"USDC","name":"USD Coin","address":"0xE0C2e4F894D4Cd33626e33b24582559F3156E1Ab","decimals":6,"kind":"LSP7"},{"symbol":"LLI","name":"LuksoLIama","address":"0xF9Cd332aD87dedB1dA33ADffeE18eF41F300C238","decimals":18,"kind":"LSP7"}],"arbitraryTokens":{"supported":true,"notes":"Pass any LUKSO mainnet LSP7 token address to /api/agents/swap-intent as tokenIn or tokenOut. Phlox routes via the active V3 factory and falls back to the client-side smart order router. Verify any unfamiliar address against on-chain metadata before use."},"uiRoutes":[{"path":"/swap","purpose":"Token swap UI (exact-in or exact-out)","agentEntry":"/swap?inputCurrency=...&outputCurrency=...&exactAmount=...&exactField=input&agentHandoff=true&ackTokenWarning=true#agent-workflow"},{"path":"/add","purpose":"Add liquidity (V3, optional V2)"},{"path":"/remove/:tokenId","purpose":"Decrease/collect from a V3 LP NFT position"},{"path":"/transfer/:in/:out/:fee/:tokenId","purpose":"Transfer a V3 LP NFT to another recipient"},{"path":"/create-token","purpose":"Deploy a new LSP7 token with LSP4 metadata"},{"path":"/airdrop-tool","purpose":"Batch token distribution to multiple recipients"},{"path":"/vote/:governorIndex/:id","purpose":"Cast a vote on a governance proposal"},{"path":"/vote/create-proposal","purpose":"Submit a new governance proposal"},{"path":"/social","purpose":"Trade activity, profiles, follow graph (read-only on-chain via Envio)"},{"path":"/explore","purpose":"Token, pool, and analytics exploration"},{"path":"/pools","purpose":"Browse Phlox liquidity pools"},{"path":"/nfts","purpose":"NFT discovery"},{"path":"/:address/tree","purpose":"UPtree — public Universal Profile link page"},{"path":"/agents","purpose":"Agent landing — workflow, examples, links"}],"agentQuickstart":["Fetch https://phlox.social/llms.txt for the full agent guide.","Fetch https://phlox.social/api/agents/index (this endpoint) for a machine-readable catalog.","For a swap, POST to https://phlox.social/api/agents/swap-intent with either { instruction } or a structured request.","Fetch the returned links.quote with no-store caching to get a fresh route + expected output.","Build the swap calldata with @phlox-labs/universal-router-sdk SwapRouter.swapERC20CallParameters or NonfungiblePositionManager.* for liquidity. For Universal Profiles, wrap in UP.execute or UP.executeBatch.","Simulate via POST /api/rpc/lukso with eth_call or eth_estimateGas.","Sign and broadcast with the agent's controller EOA. Phlox does not sign or submit.","Verify the receipt: status, balances, recipient ownership, and Phlox/indexer attribution."],"universalProfileNotes":{"summary":"A Universal Profile (UP, LSP0/ERC725Account) is the on-chain wallet. A controller EOA only signs and pays gas. For UP-owned trading the call must be UP.execute(operation, target, value, data) — never controller → router directly.","executionPaths":[{"name":"Direct UP.execute","when":"agent has direct UP owner permission","calldata":"UP.execute(0 /* CALL */, target, value, data)"},{"name":"UP.executeBatch","when":"token input requires authorizeOperator + router call","calldata":"UP.executeBatch([CALL, CALL], [token, router], [0, value], [authorizeOperatorData, routerExecuteData])"},{"name":"LSP6 Key Manager relay","when":"agent is a relayed controller and Phlox attribution should display the UP","calldata":"KeyManager.executeRelayCall(signature, nonce, validityTimestamps, payload) where payload is the UP.execute(...) calldata. Selector 0x4c8a4e74 (single) or 0xa20856a5 (batch)."}],"authorizationCalldata":"For LSP7 input on UP: UP.execute(0, inputLSP7, 0, inputLSP7.authorizeOperator(router, amount, router.executeCalldata)) before the router call. For native LYX, pass `value` from the UP, not the controller."},"documentation":{"llmsTxt":"https://phlox.social/llms.txt","agentLanding":"https://phlox.social/agents","explorer":"https://explorer.execution.mainnet.lukso.network","luksoDocs":"https://docs.lukso.tech"},"contact":"agents@phlox.social"}