@oracle-agent/oracle 0.13.0 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/README.md +525 -13
  2. package/SECURITY.md +114 -0
  3. package/SETUP.md +319 -0
  4. package/artifacts/inscription/oracle-was-here-preview.png +0 -0
  5. package/artifacts/inscription/oracle-was-here.svg +1 -0
  6. package/artifacts/specialist-packs/oracle-full-crypto.json +298 -0
  7. package/dist/action-receipts.mjs +1 -0
  8. package/dist/action-semantics.mjs +1 -0
  9. package/dist/address-book.mjs +2 -0
  10. package/dist/assets/profiles/_template/SOUL.md +54 -0
  11. package/dist/assets/profiles/_template/profile.json +22 -0
  12. package/dist/assets/profiles/bitcoin-agent/SOUL.md +31 -0
  13. package/dist/assets/profiles/bitcoin-agent/profile.json +32 -0
  14. package/dist/assets/profiles/hyperliquid-agent/SOUL.md +34 -0
  15. package/dist/assets/profiles/hyperliquid-agent/profile.json +38 -0
  16. package/dist/assets/profiles/oracle/SOUL.md +134 -0
  17. package/dist/assets/profiles/oracle/profile.json +40 -0
  18. package/dist/assets/profiles/polymarket-agent/SOUL.md +35 -0
  19. package/dist/assets/profiles/polymarket-agent/profile.json +34 -0
  20. package/dist/assets/profiles/profile.schema.json +90 -0
  21. package/dist/assets/profiles/protocol-builder/SOUL.md +57 -0
  22. package/dist/assets/profiles/protocol-builder/profile.json +39 -0
  23. package/dist/assets/profiles/robinhood-agent/SOUL.md +53 -0
  24. package/dist/assets/profiles/robinhood-agent/profile.json +41 -0
  25. package/dist/assets/profiles/solana-agent/SOUL.md +37 -0
  26. package/dist/assets/profiles/solana-agent/profile.json +38 -0
  27. package/dist/assets/profiles/stable-agent/SOUL.md +43 -0
  28. package/dist/assets/profiles/stable-agent/profile.json +38 -0
  29. package/dist/assets/skills/balance/SKILL.md +176 -0
  30. package/dist/assets/skills/bitcoin-l1.md +33 -0
  31. package/dist/assets/skills/chain-defi-ecosystem-profiling.md +27 -0
  32. package/dist/assets/skills/evm-contract-research.md +27 -0
  33. package/dist/assets/skills/hyperliquid.md +26 -0
  34. package/dist/assets/skills/multichain-exec-desk.md +33 -0
  35. package/dist/assets/skills/oracle-action-semantics/SKILL.md +40 -0
  36. package/dist/assets/skills/oracle-best-execution/SKILL.md +127 -0
  37. package/dist/assets/skills/oracle-best-execution.md +27 -0
  38. package/dist/assets/skills/oracle-bitcoin/SKILL.md +53 -0
  39. package/dist/assets/skills/oracle-chain-graphs-telegram-cards/SKILL.md +59 -0
  40. package/dist/assets/skills/oracle-chat/SKILL.md +61 -0
  41. package/dist/assets/skills/oracle-chat/chain.SKILL.md +31 -0
  42. package/dist/assets/skills/oracle-chat/setup.SKILL.md +37 -0
  43. package/dist/assets/skills/oracle-circuit-breaker/SKILL.md +51 -0
  44. package/dist/assets/skills/oracle-contract-research/SKILL.md +55 -0
  45. package/dist/assets/skills/oracle-desk/SKILL.md +58 -0
  46. package/dist/assets/skills/oracle-desk.md +27 -0
  47. package/dist/assets/skills/oracle-dex-launch/SKILL.md +38 -0
  48. package/dist/assets/skills/oracle-equities/SKILL.md +62 -0
  49. package/dist/assets/skills/oracle-grants/SKILL.md +69 -0
  50. package/dist/assets/skills/oracle-hypercore-staking/SKILL.md +57 -0
  51. package/dist/assets/skills/oracle-hyperliquid/SKILL.md +56 -0
  52. package/dist/assets/skills/oracle-meme-token-sniper/SKILL.md +73 -0
  53. package/dist/assets/skills/oracle-multichain-nft-launch/SKILL.md +338 -0
  54. package/dist/assets/skills/oracle-multichain-token-launch/SKILL.md +300 -0
  55. package/dist/assets/skills/oracle-nft-gacha-launch/SKILL.md +48 -0
  56. package/dist/assets/skills/oracle-nft-mint-gas-war/SKILL.md +63 -0
  57. package/dist/assets/skills/oracle-polymarket/SKILL.md +60 -0
  58. package/dist/assets/skills/oracle-protocol-builder/SKILL.md +59 -0
  59. package/dist/assets/skills/oracle-protocol-security/SKILL.md +60 -0
  60. package/dist/assets/skills/oracle-public-product/SKILL.md +44 -0
  61. package/dist/assets/skills/oracle-receipts/SKILL.md +52 -0
  62. package/dist/assets/skills/oracle-receipts.md +29 -0
  63. package/dist/assets/skills/oracle-rfq-tokenized-assets/SKILL.md +69 -0
  64. package/dist/assets/skills/oracle-smart-wallet-scanner/SKILL.md +49 -0
  65. package/dist/assets/skills/oracle-solana/SKILL.md +65 -0
  66. package/dist/assets/skills/oracle-solana-nft/SKILL.md +54 -0
  67. package/dist/assets/skills/oracle-token-research/SKILL.md +67 -0
  68. package/dist/assets/skills/solana.md +22 -0
  69. package/dist/bin/desk-server.mjs +59 -0
  70. package/dist/bin/oracle-data-mcp.mjs +8 -0
  71. package/dist/bin/oracle-equities.mjs +20 -0
  72. package/dist/bin/oracle-init.mjs +24 -0
  73. package/dist/bin/oracle-public-server.mjs +5 -0
  74. package/dist/bin/oracle-route.mjs +22 -0
  75. package/dist/bin/oracle-scan.mjs +18 -0
  76. package/dist/bin/oracle-upgrade.mjs +21 -0
  77. package/dist/bin/oracle.mjs +76 -0
  78. package/dist/chains.mjs +1 -0
  79. package/dist/cli/commands/auth.mjs +16 -0
  80. package/dist/cli/commands/bootstrap.mjs +18 -0
  81. package/dist/cli/commands/chain.mjs +21 -0
  82. package/dist/cli/commands/chat.mjs +45 -0
  83. package/dist/cli/commands/credential.mjs +1 -0
  84. package/dist/cli/commands/data-mcp.mjs +2 -0
  85. package/dist/cli/commands/data.mjs +12 -0
  86. package/dist/cli/commands/doctor.mjs +5 -0
  87. package/dist/cli/commands/equities.mjs +15 -0
  88. package/dist/cli/commands/farm.mjs +59 -0
  89. package/dist/cli/commands/follow.mjs +28 -0
  90. package/dist/cli/commands/gate.mjs +13 -0
  91. package/dist/cli/commands/harness.mjs +15 -0
  92. package/dist/cli/commands/help.mjs +1 -0
  93. package/dist/cli/commands/init.mjs +3 -0
  94. package/dist/cli/commands/mcp.mjs +60 -0
  95. package/dist/cli/commands/model.mjs +54 -0
  96. package/dist/cli/commands/plugins.mjs +38 -0
  97. package/dist/cli/commands/prepare.mjs +2 -0
  98. package/dist/cli/commands/public.mjs +3 -0
  99. package/dist/cli/commands/resolve.mjs +23 -0
  100. package/dist/cli/commands/route.mjs +2 -0
  101. package/dist/cli/commands/runner.mjs +1 -0
  102. package/dist/cli/commands/scan.mjs +2 -0
  103. package/dist/cli/commands/setup.mjs +34 -0
  104. package/dist/cli/commands/sign.mjs +21 -0
  105. package/dist/cli/commands/signer.mjs +1 -0
  106. package/dist/cli/commands/swap.mjs +36 -0
  107. package/dist/cli/commands/upgrade.mjs +2 -0
  108. package/dist/cli/commands/vault.mjs +1 -0
  109. package/dist/cli/commands/version.mjs +2 -0
  110. package/dist/data/desk-data.mjs +55 -0
  111. package/dist/data/names.mjs +2 -0
  112. package/dist/data/providers/farming.mjs +2 -0
  113. package/dist/equities/index.mjs +1 -0
  114. package/dist/index.mjs +60 -0
  115. package/dist/nft-gas-war-guard.mjs +1 -0
  116. package/dist/onboarding/harness-configs.mjs +4 -0
  117. package/dist/portfolio-risk.mjs +1 -0
  118. package/dist/prepare-envelope.mjs +1 -0
  119. package/dist/public-api/agent-grants.mjs +3 -0
  120. package/dist/public-control/policy-schema.mjs +1 -0
  121. package/dist/router/index.mjs +2 -0
  122. package/dist/scanner/index.mjs +4 -0
  123. package/dist/signals/index.mjs +1 -0
  124. package/dist/watch-preferences.mjs +1 -0
  125. package/package.json +66 -16
  126. package/public/agent-connect/app.js +84 -0
  127. package/public/agent-connect/index.html +83 -0
  128. package/public/agent-connect/styles.css +70 -0
  129. package/public/index.html +12 -0
  130. package/public/oracle-console/app.js +272 -0
  131. package/public/oracle-console/bitcoin-wallets.js +206 -0
  132. package/public/oracle-console/index.html +91 -0
  133. package/public/oracle-console/styles.css +239 -0
  134. package/public/oracle-splash/_variants/ice.html +2073 -0
  135. package/public/oracle-splash/_variants/ivory.html +2075 -0
  136. package/public/oracle-splash/assets/agents/claude.png +0 -0
  137. package/public/oracle-splash/assets/agents/codex.png +0 -0
  138. package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
  139. package/public/oracle-splash/assets/desktop-app.jpg +0 -0
  140. package/public/oracle-splash/assets/hero/cli-session-poster.jpg +0 -0
  141. package/public/oracle-splash/assets/hero/cli-session.mp4 +0 -0
  142. package/public/oracle-splash/assets/hero/cli-session.webm +0 -0
  143. package/public/oracle-splash/assets/hero/orb-poster.jpg +0 -0
  144. package/public/oracle-splash/assets/hero/orb.avif +0 -0
  145. package/public/oracle-splash/assets/hero/orb.webm +0 -0
  146. package/public/oracle-splash/assets/hero/risk-session-poster.jpg +0 -0
  147. package/public/oracle-splash/assets/hero/risk-session.mp4 +0 -0
  148. package/public/oracle-splash/assets/hero/risk-session.webm +0 -0
  149. package/public/oracle-splash/assets/hero/route-session-poster.jpg +0 -0
  150. package/public/oracle-splash/assets/hero/route-session.mp4 +0 -0
  151. package/public/oracle-splash/assets/hero/route-session.webm +0 -0
  152. package/public/oracle-splash/assets/llms/claude.svg +1 -0
  153. package/public/oracle-splash/assets/llms/codex-icon.svg +1 -0
  154. package/public/oracle-splash/assets/llms/codex.svg +1 -0
  155. package/public/oracle-splash/assets/llms/cursor-icon.svg +12 -0
  156. package/public/oracle-splash/assets/llms/cursor.svg +17 -0
  157. package/public/oracle-splash/assets/llms/deepseek.svg +1 -0
  158. package/public/oracle-splash/assets/llms/gemini-icon.svg +1 -0
  159. package/public/oracle-splash/assets/llms/gemini.svg +1 -0
  160. package/public/oracle-splash/assets/llms/grok.svg +8 -0
  161. package/public/oracle-splash/assets/llms/hermes.png +0 -0
  162. package/public/oracle-splash/assets/llms/kimi-icon.svg +1 -0
  163. package/public/oracle-splash/assets/llms/kimi.svg +1 -0
  164. package/public/oracle-splash/assets/llms/manus.svg +18 -0
  165. package/public/oracle-splash/assets/llms/openclaw.svg +22 -0
  166. package/public/oracle-splash/assets/llms/perplexity.svg +1 -0
  167. package/public/oracle-splash/assets/llms/qwen.svg +1 -0
  168. package/public/oracle-splash/assets/llms/windsurf.svg +1 -0
  169. package/public/oracle-splash/assets/protocols/abcdex.png +0 -0
  170. package/public/oracle-splash/assets/protocols/across.png +0 -0
  171. package/public/oracle-splash/assets/protocols/aerodrome.png +0 -0
  172. package/public/oracle-splash/assets/protocols/balancer.png +0 -0
  173. package/public/oracle-splash/assets/protocols/cowswap.png +0 -0
  174. package/public/oracle-splash/assets/protocols/curve.png +0 -0
  175. package/public/oracle-splash/assets/protocols/dreamcash.png +0 -0
  176. package/public/oracle-splash/assets/protocols/felix.png +0 -0
  177. package/public/oracle-splash/assets/protocols/gmx.png +0 -0
  178. package/public/oracle-splash/assets/protocols/hyena.png +0 -0
  179. package/public/oracle-splash/assets/protocols/hyperbeat.png +0 -0
  180. package/public/oracle-splash/assets/protocols/hyperliquid.png +0 -0
  181. package/public/oracle-splash/assets/protocols/hyperswap.png +0 -0
  182. package/public/oracle-splash/assets/protocols/jupiter.png +0 -0
  183. package/public/oracle-splash/assets/protocols/kinetiq.png +0 -0
  184. package/public/oracle-splash/assets/protocols/lfj.png +0 -0
  185. package/public/oracle-splash/assets/protocols/lifi.png +0 -0
  186. package/public/oracle-splash/assets/protocols/magic-eden.png +0 -0
  187. package/public/oracle-splash/assets/protocols/morpho.png +0 -0
  188. package/public/oracle-splash/assets/protocols/odos.png +0 -0
  189. package/public/oracle-splash/assets/protocols/oneinch.png +0 -0
  190. package/public/oracle-splash/assets/protocols/opensea.png +0 -0
  191. package/public/oracle-splash/assets/protocols/pancakeswap.png +0 -0
  192. package/public/oracle-splash/assets/protocols/paragon.png +0 -0
  193. package/public/oracle-splash/assets/protocols/paraswap.png +0 -0
  194. package/public/oracle-splash/assets/protocols/pendle.png +0 -0
  195. package/public/oracle-splash/assets/protocols/polymarket.png +0 -0
  196. package/public/oracle-splash/assets/protocols/quickswap.png +0 -0
  197. package/public/oracle-splash/assets/protocols/relay.png +0 -0
  198. package/public/oracle-splash/assets/protocols/stargate.png +0 -0
  199. package/public/oracle-splash/assets/protocols/tradexyz.png +0 -0
  200. package/public/oracle-splash/assets/protocols/uniswap.png +0 -0
  201. package/public/oracle-splash/assets/protocols/velodrome.png +0 -0
  202. package/public/oracle-splash/assets/protocols/ventuals.png +0 -0
  203. package/public/oracle-splash/assets/wordmarks/across-icon.webp +0 -0
  204. package/public/oracle-splash/assets/wordmarks/across.svg +4 -0
  205. package/public/oracle-splash/assets/wordmarks/aerodrome.svg +23 -0
  206. package/public/oracle-splash/assets/wordmarks/balancer.svg +3 -0
  207. package/public/oracle-splash/assets/wordmarks/cowswap.svg +1 -0
  208. package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
  209. package/public/oracle-splash/assets/wordmarks/gmx.svg +13 -0
  210. package/public/oracle-splash/assets/wordmarks/hop-icon.webp +0 -0
  211. package/public/oracle-splash/assets/wordmarks/hyena.svg +7 -0
  212. package/public/oracle-splash/assets/wordmarks/hyperliquid.svg +21 -0
  213. package/public/oracle-splash/assets/wordmarks/hyperswap.svg +13 -0
  214. package/public/oracle-splash/assets/wordmarks/jupiter.svg +35 -0
  215. package/public/oracle-splash/assets/wordmarks/kinetiq.svg +1 -0
  216. package/public/oracle-splash/assets/wordmarks/lfj.webp +0 -0
  217. package/public/oracle-splash/assets/wordmarks/lifi.png +0 -0
  218. package/public/oracle-splash/assets/wordmarks/magic-eden.svg +1 -0
  219. package/public/oracle-splash/assets/wordmarks/markets.svg +1 -0
  220. package/public/oracle-splash/assets/wordmarks/morpho.svg +1 -0
  221. package/public/oracle-splash/assets/wordmarks/odos.svg +3 -0
  222. package/public/oracle-splash/assets/wordmarks/oneinch-icon.webp +0 -0
  223. package/public/oracle-splash/assets/wordmarks/oneinch.svg +6 -0
  224. package/public/oracle-splash/assets/wordmarks/opensea-icon.svg +17 -0
  225. package/public/oracle-splash/assets/wordmarks/opensea.svg +1 -0
  226. package/public/oracle-splash/assets/wordmarks/outcome.svg +16 -0
  227. package/public/oracle-splash/assets/wordmarks/pancakeswap.svg +18 -0
  228. package/public/oracle-splash/assets/wordmarks/paragon.svg +9 -0
  229. package/public/oracle-splash/assets/wordmarks/paraswap.svg +16 -0
  230. package/public/oracle-splash/assets/wordmarks/pendle.png +0 -0
  231. package/public/oracle-splash/assets/wordmarks/polymarket.png +0 -0
  232. package/public/oracle-splash/assets/wordmarks/quickswap.png +0 -0
  233. package/public/oracle-splash/assets/wordmarks/relay.svg +8 -0
  234. package/public/oracle-splash/assets/wordmarks/satflow-icon.png +0 -0
  235. package/public/oracle-splash/assets/wordmarks/stargate-icon.webp +0 -0
  236. package/public/oracle-splash/assets/wordmarks/stargate.svg +15 -0
  237. package/public/oracle-splash/assets/wordmarks/uniswap.svg +18 -0
  238. package/public/oracle-splash/assets/wordmarks/velodrome.svg +84 -0
  239. package/public/oracle-splash/assets/wordmarks/xyz.svg +12 -0
  240. package/public/oracle-splash/assets/wordmarks/zerox-icon.webp +0 -0
  241. package/public/oracle-splash/brand/aave.webp +0 -0
  242. package/public/oracle-splash/brand/aavev2.webp +0 -0
  243. package/public/oracle-splash/brand/aborean.webp +0 -0
  244. package/public/oracle-splash/brand/across.webp +0 -0
  245. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  246. package/public/oracle-splash/brand/afi.webp +0 -0
  247. package/public/oracle-splash/brand/arcus.webp +0 -0
  248. package/public/oracle-splash/brand/aster.webp +0 -0
  249. package/public/oracle-splash/brand/avant.webp +0 -0
  250. package/public/oracle-splash/brand/balancer.webp +0 -0
  251. package/public/oracle-splash/brand/beefy.webp +0 -0
  252. package/public/oracle-splash/brand/benqi.webp +0 -0
  253. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  254. package/public/oracle-splash/brand/bitfi.webp +0 -0
  255. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  256. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  257. package/public/oracle-splash/brand/camelot.webp +0 -0
  258. package/public/oracle-splash/brand/compound.webp +0 -0
  259. package/public/oracle-splash/brand/concrete.webp +0 -0
  260. package/public/oracle-splash/brand/cow.webp +0 -0
  261. package/public/oracle-splash/brand/curve.webp +0 -0
  262. package/public/oracle-splash/brand/derive.webp +0 -0
  263. package/public/oracle-splash/brand/dolomite.webp +0 -0
  264. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  265. package/public/oracle-splash/brand/ekubo.webp +0 -0
  266. package/public/oracle-splash/brand/ethena.webp +0 -0
  267. package/public/oracle-splash/brand/etherfi.webp +0 -0
  268. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  269. package/public/oracle-splash/brand/felix.webp +0 -0
  270. package/public/oracle-splash/brand/fluid.webp +0 -0
  271. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  272. package/public/oracle-splash/brand/folks.webp +0 -0
  273. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  274. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  275. package/public/oracle-splash/brand/gassss.webp +0 -0
  276. package/public/oracle-splash/brand/gmx.webp +0 -0
  277. package/public/oracle-splash/brand/harmonix.webp +0 -0
  278. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  279. package/public/oracle-splash/brand/hlp.webp +0 -0
  280. package/public/oracle-splash/brand/hop.webp +0 -0
  281. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  282. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  283. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  284. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  285. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  286. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  287. package/public/oracle-splash/brand/hypha.webp +0 -0
  288. package/public/oracle-splash/brand/joedex.webp +0 -0
  289. package/public/oracle-splash/brand/jupiter.webp +0 -0
  290. package/public/oracle-splash/brand/kelp.webp +0 -0
  291. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  292. package/public/oracle-splash/brand/kmhype.webp +0 -0
  293. package/public/oracle-splash/brand/kona.webp +0 -0
  294. package/public/oracle-splash/brand/konalend.webp +0 -0
  295. package/public/oracle-splash/brand/lfj.webp +0 -0
  296. package/public/oracle-splash/brand/lido.webp +0 -0
  297. package/public/oracle-splash/brand/lifi.webp +0 -0
  298. package/public/oracle-splash/brand/lighter.webp +0 -0
  299. package/public/oracle-splash/brand/lista.webp +0 -0
  300. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  301. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  302. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  303. package/public/oracle-splash/brand/magiceden.webp +0 -0
  304. package/public/oracle-splash/brand/mempool.png +0 -0
  305. package/public/oracle-splash/brand/meteora.webp +0 -0
  306. package/public/oracle-splash/brand/morpho.webp +0 -0
  307. package/public/oracle-splash/brand/myriad.webp +0 -0
  308. package/public/oracle-splash/brand/noxa.webp +0 -0
  309. package/public/oracle-splash/brand/odos.webp +0 -0
  310. package/public/oracle-splash/brand/oneinch.webp +0 -0
  311. package/public/oracle-splash/brand/openbook.webp +0 -0
  312. package/public/oracle-splash/brand/opensea.webp +0 -0
  313. package/public/oracle-splash/brand/orca.webp +0 -0
  314. package/public/oracle-splash/brand/ordinals.png +0 -0
  315. package/public/oracle-splash/brand/ostium.webp +0 -0
  316. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  317. package/public/oracle-splash/brand/pendle.webp +0 -0
  318. package/public/oracle-splash/brand/perena.webp +0 -0
  319. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  320. package/public/oracle-splash/brand/phoenix.webp +0 -0
  321. package/public/oracle-splash/brand/polymarket.webp +0 -0
  322. package/public/oracle-splash/brand/polynomial.webp +0 -0
  323. package/public/oracle-splash/brand/projectx.webp +0 -0
  324. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  325. package/public/oracle-splash/brand/quickswap.webp +0 -0
  326. package/public/oracle-splash/brand/rain.webp +0 -0
  327. package/public/oracle-splash/brand/raydium.webp +0 -0
  328. package/public/oracle-splash/brand/relay.webp +0 -0
  329. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  330. package/public/oracle-splash/brand/saber.webp +0 -0
  331. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  332. package/public/oracle-splash/brand/sanctum.webp +0 -0
  333. package/public/oracle-splash/brand/satflow.png +0 -0
  334. package/public/oracle-splash/brand/sierra.webp +0 -0
  335. package/public/oracle-splash/brand/sky.webp +0 -0
  336. package/public/oracle-splash/brand/solv.webp +0 -0
  337. package/public/oracle-splash/brand/spark.webp +0 -0
  338. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  339. package/public/oracle-splash/brand/sphere.webp +0 -0
  340. package/public/oracle-splash/brand/ssv.webp +0 -0
  341. package/public/oracle-splash/brand/stabble.webp +0 -0
  342. package/public/oracle-splash/brand/stableswap.webp +0 -0
  343. package/public/oracle-splash/brand/stakewise.webp +0 -0
  344. package/public/oracle-splash/brand/stargate.webp +0 -0
  345. package/public/oracle-splash/brand/sthype.webp +0 -0
  346. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  347. package/public/oracle-splash/brand/unisat.png +0 -0
  348. package/public/oracle-splash/brand/uniswap.webp +0 -0
  349. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  350. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  351. package/public/oracle-splash/brand/unit.webp +0 -0
  352. package/public/oracle-splash/brand/velodrome.webp +0 -0
  353. package/public/oracle-splash/brand/velora.webp +0 -0
  354. package/public/oracle-splash/brand/venus.webp +0 -0
  355. package/public/oracle-splash/brand/wbeth.webp +0 -0
  356. package/public/oracle-splash/brand/xsy.webp +0 -0
  357. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  358. package/public/oracle-splash/brand/zerobase.webp +0 -0
  359. package/public/oracle-splash/brand/zerox.webp +0 -0
  360. package/public/oracle-splash/downloads/index.html +241 -0
  361. package/public/oracle-splash/favicon.ico +0 -0
  362. package/public/oracle-splash/favicon.svg +6 -0
  363. package/public/oracle-splash/index.html +2537 -0
  364. package/public/oracle-splash/mesh-graph.png +0 -0
  365. package/public/oracle-splash/mesh-graph.svg +216 -0
  366. package/bin/oracle.mjs +0 -25
@@ -0,0 +1,2537 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>ORACLE</title>
7
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
8
+ <link rel="shortcut icon" href="/favicon.ico">
9
+ <meta name="description" content="ORACLE is a self-custodial agent control plane for wallets, markets, and protocol routes.">
10
+ <meta name="theme-color" content="#0B1018" />
11
+ <meta name="robots" content="noindex,nofollow" />
12
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
13
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
14
+ <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=IBM+Plex+Mono:wght@400;500;600&family=Outfit:wght@300;400;500;600;700&family=UnifrakturCook:wght@700&display=swap" rel="stylesheet" />
15
+ <style>
16
+ :root{
17
+ --bg:#0B1018;
18
+ --panel:#111925;
19
+ --panel-2:#152031;
20
+ --blue:#7CC4FF;
21
+ --blue2:#A7D8FF;
22
+ --blue-dim:#3a6f99;
23
+ --ink:#F4F9FE;
24
+ --cool:#C9DAEC;
25
+ --mute:#9FB8D2;
26
+ --line:rgba(124,196,255,.14);
27
+ --line-2:rgba(124,196,255,.24);
28
+ --evm:#7CC4FF;
29
+ --hl:#50D2C1;
30
+ --rh:#d7ff4d;
31
+ --sol:#9945FF;
32
+ --poly:#3B82F6;
33
+ --stable:#F0B90B;
34
+ --display:"Cormorant Garamond",Georgia,"Times New Roman",serif;
35
+ --sans:"Outfit",system-ui,sans-serif;
36
+ --mono:"IBM Plex Mono",ui-monospace,monospace;
37
+ --ease:cubic-bezier(.16,1,.3,1);
38
+ --pad:clamp(18px,4vw,48px);
39
+
40
+ --fs-micro:10px;
41
+ --fs-xs:12px;
42
+ --fs-sm:13.5px;
43
+ --fs-base:15px;
44
+ --fs-md:clamp(18px,1.6vw,20px);
45
+ --fs-lg:clamp(22px,2.2vw,26px);
46
+ --fs-xl:clamp(28px,3.2vw,34px);
47
+ --fs-2xl:clamp(34px,4.4vw,50px);
48
+ --fs-3xl:clamp(46px,6.5vw,84px);
49
+ --fs-4xl:clamp(64px,10vw,150px);
50
+ --r-sm:12px;
51
+ --r-md:16px;
52
+ --r-lg:22px;
53
+ --r-pill:999px;
54
+ --space-1:4px;
55
+ --space-2:8px;
56
+ --space-3:12px;
57
+ --space-4:16px;
58
+ --space-5:24px;
59
+ --space-6:32px;
60
+ --space-7:48px;
61
+ --space-8:72px;
62
+ --space-9:110px;
63
+ --max:1100px;
64
+ }
65
+ *{box-sizing:border-box;margin:0;padding:0}
66
+ html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;overflow-x:clip;max-width:100%}
67
+ body{
68
+ min-height:100dvh;background:var(--bg);color:var(--ink);position:relative;isolation:isolate;
69
+ font-family:var(--sans);font-weight:400;overflow-x:clip;max-width:100vw;
70
+ }
71
+ ::selection{background:var(--blue);color:#071018}
72
+ a{color:inherit;text-decoration:none}
73
+ button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
74
+ img{display:inline-block}
75
+
76
+ .grain{
77
+ position:fixed;inset:0;z-index:40;pointer-events:none;opacity:.04;mix-blend-mode:soft-light;
78
+ background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 .55 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
79
+ }
80
+
81
+ /* ── orbital oracle mark ───────────────────────────── */
82
+ .orbital{position:relative;display:inline-block}
83
+ .orbital svg{display:block;overflow:visible;width:100%;height:100%}
84
+ .orbital .ring{transform-origin:50% 50%;fill:none;stroke:var(--blue);stroke-width:2;opacity:.55}
85
+ .orbital .ring ellipse{vector-effect:non-scaling-stroke}
86
+ .orbital .r1{animation:orb-spin 13s linear infinite}
87
+ .orbital .r2{animation:orb-spin 21s linear infinite reverse;opacity:.4}
88
+ .orbital .r3{animation:orb-spin 32s linear infinite;opacity:.28}
89
+ .orbital .tickring{transform-origin:50% 50%;fill:none;stroke:rgba(124,196,255,.35);stroke-width:1.4;stroke-dasharray:2 7;animation:orb-spin 46s linear infinite reverse}
90
+ .orbital .core{fill:var(--blue);animation:core-pulse 3.2s var(--ease) infinite}
91
+ .orbital .halo{fill:none;stroke:rgba(124,196,255,.22);stroke-width:5;filter:blur(3px)}
92
+ @keyframes orb-spin{to{transform:rotate(360deg)}}
93
+ @keyframes core-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.06)}}
94
+ @keyframes core-billboard{from{transform:rotateY(0deg) rotateX(-18deg) rotateZ(8deg)}to{transform:rotateY(-360deg) rotateX(-18deg) rotateZ(8deg)}}
95
+ @keyframes orbit-travel{from{transform:rotateX(76deg) rotateZ(0deg) translateX(clamp(170px,23vw,280px))}to{transform:rotateX(76deg) rotateZ(360deg) translateX(clamp(170px,23vw,280px))}}
96
+
97
+ .loader{
98
+ position:fixed;inset:0;z-index:50;background:var(--bg);
99
+ display:grid;place-items:center;
100
+ transition:opacity .7s var(--ease),visibility .7s;
101
+ }
102
+ .loader.out{opacity:0;visibility:hidden;pointer-events:none}
103
+ .loader-inner{display:flex;flex-direction:column;align-items:center;gap:18px}
104
+ .loader-mark{width:clamp(150px,26vmin,240px);height:clamp(150px,26vmin,240px);filter:drop-shadow(0 0 34px rgba(124,196,255,.42))}
105
+
106
+ .progress{
107
+ position:fixed;top:0;left:0;right:0;height:2px;z-index:35;pointer-events:none;
108
+ background:linear-gradient(90deg,var(--blue),var(--blue2));
109
+ transform-origin:0 50%;transform:scaleX(0);
110
+ box-shadow:0 0 12px rgba(124,196,255,.5);
111
+ }
112
+
113
+ .nav{
114
+ position:fixed;top:0;left:0;right:0;z-index:30;
115
+ display:grid;
116
+ grid-template-columns:1fr auto;
117
+ align-items:center;gap:16px;
118
+ padding:14px var(--pad);
119
+ background:rgba(11,16,24,.82);
120
+ border-bottom:1px solid var(--line);
121
+ }
122
+ .brand{
123
+ display:flex;align-items:center;gap:12px;
124
+ font-family:var(--display);font-size:var(--fs-lg);font-weight:400;letter-spacing:.02em;
125
+ text-transform:none;justify-self:start;
126
+ }
127
+ .brand .orbital{width:26px;height:26px;filter:drop-shadow(0 0 10px rgba(124,196,255,.6))}
128
+ .nav-links{
129
+ display:flex;align-items:center;gap:18px;justify-self:end;
130
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.18em;text-transform:uppercase;color:var(--cool);
131
+ }
132
+ .nav-links a{opacity:.78;transition:opacity .25s,color .25s}
133
+ .nav-links a:hover{opacity:1;color:var(--blue2)}
134
+ .nav-chip{
135
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;
136
+ border:1px solid rgba(124,196,255,.3);border-radius:999px;padding:7px 11px;color:var(--blue2);opacity:.95;
137
+ }
138
+ .nav-cta{
139
+ border:1px solid rgba(124,196,255,.28);border-radius:999px;padding:10px 16px;color:var(--ink);
140
+ transition:border-color .3s,color .3s,box-shadow .3s;
141
+ }
142
+ .nav-cta:hover{border-color:var(--blue);color:var(--blue2);box-shadow:0 0 0 1px rgba(124,196,255,.12)}
143
+
144
+ /* fixed soft field behind content */
145
+ #gl{position:fixed;inset:0;width:100%;height:100%;z-index:-1;display:block;opacity:.4;pointer-events:none}
146
+ .veil{
147
+ position:fixed;inset:0;z-index:1;pointer-events:none;
148
+ background:
149
+ radial-gradient(60% 50% at 50% 28%, rgba(124,196,255,.10), transparent 58%),
150
+ linear-gradient(180deg, rgba(11,16,24,.12), rgba(11,16,24,.42));
151
+ }
152
+ main{position:relative;z-index:2;padding-top:84px}
153
+
154
+
155
+ /* homepage */
156
+ .home{
157
+ overflow-x:clip;
158
+ min-height:calc(100dvh - 84px);
159
+ padding-block:clamp(28px,6vh,72px);
160
+ display:grid;place-items:center;
161
+ padding:clamp(20px,4vh,44px) var(--pad) clamp(56px,9vh,96px);
162
+ position:relative;overflow:hidden;text-align:left;
163
+ }
164
+ .home::after{
165
+ content:"";position:absolute;left:50%;bottom:22px;width:1px;height:74px;
166
+ background:linear-gradient(180deg, rgba(124,196,255,.65), transparent);
167
+ transform-origin:50% 0;animation:drop-line 2.8s var(--ease) infinite;
168
+ }
169
+ .home-inner{max-width:min(1180px,100%);width:100%;margin:0 auto;position:relative}
170
+ .hero-primary{min-width:0;display:flex;flex-direction:column;align-items:center}
171
+ .home-kicker{
172
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.34em;text-transform:uppercase;color:var(--blue);
173
+ margin-bottom:6px;position:relative;z-index:3;
174
+ }
175
+ .hero-stage{position:relative;width:100%;display:grid;place-items:center;min-height:clamp(360px,52vh,560px)}
176
+ .hero-art{position:absolute;inset:0;display:grid;place-items:center;z-index:0;pointer-events:none;overflow:clip}
177
+ .hero-orb{
178
+ width:clamp(380px,50vw,640px);aspect-ratio:1;position:relative;transform-style:preserve-3d;
179
+ animation:orb-slew 22s linear infinite;
180
+ }
181
+ .hero-orb .lat{position:absolute;inset:0;border-radius:50%;border:1.2px solid rgba(124,196,255,.42);transform-style:preserve-3d;box-shadow:0 0 26px rgba(124,196,255,.1), inset 0 0 34px rgba(124,196,255,.07)}
182
+ .hero-orb .lat.l1{transform:rotateY(0deg);border-color:rgba(167,216,255,.62)}
183
+ .hero-orb .lat.l2{transform:rotateY(45deg)}
184
+ .hero-orb .lat.l3{transform:rotateY(90deg);border-color:rgba(167,216,255,.58)}
185
+ .hero-orb .lat.l4{transform:rotateY(135deg)}
186
+ .hero-orb .par{position:absolute;left:50%;top:50%;border-radius:50%;border:1px solid rgba(124,196,255,.3);transform-style:preserve-3d;box-shadow:inset 0 0 24px rgba(124,196,255,.06)}
187
+ .hero-orb .par.p1{width:96%;height:96%;transform:translate(-50%,-50%) rotateX(90deg)}
188
+ .hero-orb .par.p2{width:78%;height:78%;transform:translate(-50%,-50%) rotateX(90deg) translateZ(calc(clamp(380px,50vw,640px) * .31))}
189
+ .hero-orb .par.p3{width:78%;height:78%;transform:translate(-50%,-50%) rotateX(90deg) translateZ(calc(clamp(380px,50vw,640px) * -.31))}
190
+ .hero-orb .eq{position:absolute;inset:-4%;border-radius:50%;border:1.8px solid rgba(190,228,255,.82);transform:rotateX(76deg);box-shadow:0 0 44px rgba(124,196,255,.4), inset 0 0 30px rgba(167,216,255,.14)}
191
+ .hero-orb .core-glow{
192
+ position:absolute;inset:38%;border-radius:50%;
193
+ transform:rotateZ(8deg) rotateX(-18deg);
194
+ animation:core-billboard 22s linear infinite;
195
+ background:
196
+ radial-gradient(circle at 36% 30%, rgba(255,255,255,.95) 0%, rgba(214,238,255,.8) 12%, rgba(140,204,255,.55) 32%, rgba(74,150,214,.34) 56%, rgba(28,74,124,.22) 78%, rgba(14,34,62,.12) 100%);
197
+ box-shadow:
198
+ inset -12px -15px 34px rgba(6,16,32,.5),
199
+ inset 8px 10px 26px rgba(210,238,255,.2),
200
+ 0 0 60px rgba(124,196,255,.5),
201
+ 0 0 140px rgba(124,196,255,.2);
202
+ }
203
+ .hero-orb .core-glow::before{
204
+ content:"";position:absolute;left:22%;top:16%;width:26%;height:20%;border-radius:50%;
205
+ background:radial-gradient(ellipse at 50% 50%, rgba(255,255,255,.9), rgba(255,255,255,.28) 44%, transparent 74%);
206
+ transform:rotate(-24deg);
207
+ }
208
+ .hero-orb .core-glow::after{
209
+ content:"";position:absolute;inset:-6%;border-radius:50%;pointer-events:none;
210
+ background:radial-gradient(circle at 50% 50%, rgba(124,196,255,.3) 0%, rgba(124,196,255,.09) 46%, transparent 68%);
211
+ animation:core-pulse 3.4s var(--ease) infinite;
212
+ }
213
+ .hero-orb .orbit-dot{position:absolute;width:9px;height:9px;border-radius:50%;background:radial-gradient(circle at 38% 34%, #fff, var(--blue2) 55%, rgba(124,196,255,.5));box-shadow:0 0 22px rgba(167,216,255,.95), 0 0 44px rgba(124,196,255,.4);left:calc(50% - 4.5px);top:calc(50% - 4.5px);transform-style:preserve-3d;animation:orbit-travel 14s linear infinite}
214
+ .home-title{
215
+ position:relative;z-index:2;
216
+ font-family:var(--display);font-weight:300;font-size:var(--fs-4xl);line-height:.9;letter-spacing:-.045em;
217
+ text-transform:uppercase;color:var(--ink);
218
+ text-shadow:0 2px 30px rgba(0,0,0,.6);
219
+ }
220
+ .home-title em{font-style:italic;color:var(--blue2)}
221
+ .home-copy{position:relative;z-index:3;display:flex;flex-direction:column;align-items:center}
222
+ .home-copy p:not(.home-kicker){max-width:56ch;color:var(--mute);font-size:var(--fs-base);line-height:1.7;margin:18px 0 0;text-shadow:0 1px 20px rgba(0,0,0,.65)}
223
+ .home-actions{display:flex;flex-wrap:wrap;gap:14px;margin-top:26px;align-items:center;justify-content:center}
224
+ .enter-cta{
225
+ display:inline-flex;align-items:center;gap:12px;border:1px solid rgba(124,196,255,.45);border-radius:999px;
226
+ padding:14px 22px;color:var(--ink);font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.18em;text-transform:uppercase;
227
+ background:linear-gradient(180deg, rgba(124,196,255,.12), rgba(124,196,255,.035));
228
+ box-shadow:0 0 0 1px rgba(124,196,255,.08),0 20px 46px rgba(0,0,0,.3);
229
+ transition:transform .35s var(--ease),border-color .35s,box-shadow .35s;
230
+ }
231
+ .enter-cta::after{content:"↓";font-size:var(--fs-sm);color:var(--blue)}
232
+ .enter-cta:hover{transform:translateY(-2px);border-color:var(--blue);box-shadow:0 0 0 1px rgba(124,196,255,.18),0 24px 58px rgba(0,0,0,.36)}
233
+ .hero-note{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
234
+ @keyframes orb-slew{0%{transform:rotateX(18deg) rotateZ(-8deg) rotateY(0deg)}100%{transform:rotateX(18deg) rotateZ(-8deg) rotateY(360deg)}}
235
+ @keyframes home-breathe{0%,100%{opacity:.65;transform:scale(1)}50%{opacity:1;transform:scale(1.07)}}
236
+ @keyframes drop-line{0%,100%{opacity:.25;transform:translateX(-50%) scaleY(.45)}50%{opacity:1;transform:translateX(-50%) scaleY(1)}}
237
+
238
+
239
+ code{font-family:var(--mono)}
240
+
241
+ .hero-note-line{white-space:nowrap;overflow:visible}
242
+ .hero-note-line code{white-space:nowrap}
243
+ @media (max-width:1180px){
244
+ .hero-note-line{white-space:normal}
245
+ .hero-note-line code{display:inline-block}
246
+ }
247
+ /* figcaption was stranded at the far left of a 742px figure while the orb sits
248
+ right of centre -- it read as a loose fragment, not a caption. Centre it under
249
+ the mark it belongs to. */
250
+ .hero-product figcaption{text-align:center;width:100%}
251
+ .section{
252
+ position:relative;z-index:2;max-width:var(--max);margin:0 auto;
253
+ padding:clamp(56px,10vh,110px) var(--pad) var(--space-8);
254
+ }
255
+ .section:first-of-type{padding-top:clamp(18px,3vh,28px)}
256
+ .section-label{
257
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.34em;text-transform:uppercase;color:var(--blue);margin-bottom:14px;
258
+ display:inline-flex;align-items:center;gap:12px;
259
+ }
260
+ .section-title{
261
+ font-family:var(--display);font-weight:400;
262
+ font-size:var(--fs-2xl);line-height:1.06;letter-spacing:-.01em;
263
+ max-width:18ch;margin-bottom:12px;
264
+ }
265
+ .section-title em{font-style:italic;color:var(--blue2)}
266
+ .section-lede{max-width:52ch;color:var(--cool);font-size:var(--fs-base);line-height:1.7;margin-bottom:clamp(28px,4vw,44px)}
267
+
268
+ /* orchestration graph */
269
+ .graph-shell{
270
+ border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;
271
+ background:linear-gradient(180deg, rgba(124,196,255,.04), transparent 42%), var(--panel);
272
+ }
273
+ .graph-top{
274
+ display:flex;flex-wrap:wrap;justify-content:center;gap:10px;
275
+ padding:14px 18px;border-bottom:1px solid var(--line);
276
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
277
+ }
278
+ .graph-top b{color:var(--blue);font-weight:500}
279
+ .graph-canvas{padding:clamp(28px,4vw,40px) clamp(14px,2.5vw,24px) clamp(22px,3vw,30px);overflow:auto}
280
+ .orch{width:min(1100px,100%);margin:0 auto;min-width:720px}
281
+ .row{display:flex;justify-content:center;gap:14px;align-items:stretch}
282
+ .row.profiles{
283
+ display:grid;
284
+ grid-template-columns:repeat(2,minmax(0,1fr));
285
+ gap:10px;width:100%;
286
+ }
287
+ @media (min-width:900px){
288
+ .row.profiles{grid-template-columns:repeat(3,minmax(0,1fr))}
289
+ }
290
+ @media (min-width:1180px){
291
+ .row.profiles{grid-template-columns:repeat(4,minmax(0,1fr))}
292
+ }
293
+ .route-strip{
294
+ display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
295
+ gap:1px;background:var(--line);border-top:1px solid var(--line);
296
+ }
297
+ @media (min-width:1100px){
298
+ .route-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
299
+ }
300
+ .node{
301
+ border:1px solid rgba(124,196,255,.42);border-radius:var(--r-md);background:rgba(21,32,49,.92);
302
+ padding:14px 12px;text-align:center;
303
+ transition:border-color .4s var(--ease),transform .4s var(--ease),box-shadow .4s var(--ease);
304
+ }
305
+ .node:hover{transform:translate3d(0,-3px,0);box-shadow:0 14px 34px rgba(0,0,0,.32)}
306
+ .node.hub{
307
+ width:min(300px,100%);
308
+ border-color:rgba(124,196,255,.5);
309
+ background:linear-gradient(180deg, rgba(124,196,255,.12), rgba(11,16,24,.88));
310
+ box-shadow:0 0 0 1px rgba(124,196,255,.08), 0 16px 40px rgba(0,0,0,.3);
311
+ padding:18px 16px 20px;
312
+ display:flex;flex-direction:column;align-items:center;
313
+ }
314
+ .node.hub .orbital{width:74px;height:74px;margin:2px 0 10px;filter:drop-shadow(0 0 20px rgba(124,196,255,.35))}
315
+ .node .tag{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.18em;text-transform:uppercase;color:var(--mute);margin-bottom:8px}
316
+ .node.hub .tag{color:var(--blue)}
317
+ .node .name{font-family:var(--display);font-size:var(--fs-lg);font-weight:500;color:var(--ink);line-height:1;letter-spacing:.01em;margin-bottom:6px}
318
+ .node.hub .name{font-size:var(--fs-xl);font-weight:400;font-style:italic}
319
+ .node .sub{font-family:var(--mono);font-size:var(--fs-xs);letter-spacing:.05em;color:var(--cool);line-height:1.5}
320
+ .node.route{min-height:138px;display:flex;flex-direction:column;justify-content:flex-start;text-align:left;padding:14px}
321
+ .node.route .name{font-size:var(--fs-md);margin-bottom:8px}
322
+ .node.route .chains{
323
+ margin-top:auto;padding-top:10px;
324
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.04em;line-height:1.7;
325
+ display:flex;flex-wrap:wrap;gap:4px 10px;align-items:center;
326
+ }
327
+ .ch-add{border:1px dashed color-mix(in oklab,var(--blue) 42%,transparent);border-radius:999px;padding:1px 7px;color:var(--blue);opacity:.92}
328
+ .ch{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
329
+ .ch img{width:13px;height:13px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
330
+ .node.add{
331
+ border-style:dashed;border-color:rgba(124,196,255,.28);
332
+ background:rgba(11,16,24,.35);
333
+ min-height:138px;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;
334
+ text-align:left;padding:14px;
335
+ }
336
+ .node.add .name{font-size:var(--fs-md);color:var(--blue2)}
337
+ .node.add .sub{color:var(--mute)}
338
+ .node.add:hover{border-color:rgba(124,196,255,.55);background:rgba(124,196,255,.06)}
339
+
340
+ .builder-row{margin-top:0;display:flex;justify-content:center}
341
+ .node.builder-sink{width:min(430px,100%);text-align:center;align-items:center;min-height:162px;position:relative}
342
+ .node.builder-sink .name{font-size:var(--fs-lg)}
343
+ .node.builder-sink .chains{justify-content:center}
344
+ .wires.funnel{height:62px}
345
+ .wires.funnel path{stroke:rgba(255,176,137,.48)}
346
+ .wires.funnel path:nth-child(2n){stroke:rgba(124,196,255,.32)}
347
+ .wires.funnel circle{fill:#ffb089}
348
+
349
+
350
+ /* protocol colors */
351
+ .node.p-hl{border-color:rgba(80,210,193,.45);background:linear-gradient(180deg, rgba(80,210,193,.14), rgba(11,16,24,.88))}
352
+ .node.p-hl .tag,.node.p-hl .name{color:var(--hl)}
353
+ .node.p-hl .chains{color:var(--hl)}
354
+ .node.p-hl:hover{border-color:var(--hl);box-shadow:0 12px 30px rgba(80,210,193,.12)}
355
+
356
+ .node.p-rh{border-color:rgba(215,255,77,.55);background:linear-gradient(180deg, rgba(215,255,77,.14), rgba(11,16,24,.88))}
357
+ .node.p-rh .tag,.node.p-rh .name{color:var(--rh)}
358
+ .node.p-rh .chains{color:var(--rh)}
359
+ .node.p-rh:hover{border-color:var(--rh);box-shadow:0 12px 30px rgba(215,255,77,.16)}
360
+
361
+ .node.p-sol{border-color:rgba(153,69,255,.5);background:linear-gradient(180deg, rgba(153,69,255,.14), rgba(11,16,24,.88))}
362
+ .node.p-sol .tag,.node.p-sol .name{color:#c4a0ff}
363
+ .node.p-sol .chains{color:#c4a0ff}
364
+ .node.p-sol:hover{border-color:var(--sol);box-shadow:0 12px 30px rgba(153,69,255,.14)}
365
+
366
+ .node.p-poly{border-color:rgba(59,130,246,.5);background:linear-gradient(180deg, rgba(59,130,246,.14), rgba(11,16,24,.88))}
367
+ .node.p-poly .tag,.node.p-poly .name{color:#93c5fd}
368
+ .node.p-poly .chains{color:#93c5fd}
369
+ .node.p-poly:hover{border-color:var(--poly);box-shadow:0 12px 30px rgba(59,130,246,.14)}
370
+
371
+ .node.p-stable{border-color:rgba(240,185,11,.5);background:linear-gradient(180deg, rgba(240,185,11,.12), rgba(11,16,24,.88))}
372
+ .node.p-build{border-color:rgba(255,140,90,.55);background:linear-gradient(180deg, rgba(255,140,90,.14), rgba(11,16,24,.88))}
373
+ .node.p-build .tag,.node.p-build .name{color:#ffb089}
374
+ .node.p-build .chains{color:#ffb089}
375
+ .node.p-build:hover{border-color:#ff8c5a;box-shadow:0 12px 30px rgba(255,140,90,.14)}
376
+ .route-card.p-build .where{color:#ffb089}
377
+ .route-card.p-build{box-shadow:inset 3px 0 0 #ff8c5a}
378
+ .node.p-stable .tag,.node.p-stable .name{color:#fcd34d}
379
+ .node.p-stable .chains{color:#fcd34d}
380
+ .node.p-stable:hover{border-color:var(--stable);box-shadow:0 12px 30px rgba(240,185,11,.12)}
381
+
382
+ .route-card.p-hl .where{color:var(--hl)}
383
+ .route-card.p-rh .where{color:var(--rh)}
384
+ .route-card.p-sol .where{color:#c4a0ff}
385
+ .route-card.p-poly .where{color:#93c5fd}
386
+ .route-card.p-stable .where{color:#fcd34d}
387
+ .route-card.p-add .where{color:var(--blue2)}
388
+ .route-card.p-hl{box-shadow:inset 3px 0 0 var(--hl)}
389
+ .route-card.p-rh{box-shadow:inset 3px 0 0 var(--rh)}
390
+ .route-card.p-sol{box-shadow:inset 3px 0 0 var(--sol)}
391
+ .route-card.p-poly{box-shadow:inset 3px 0 0 var(--poly)}
392
+ .route-card.p-stable{box-shadow:inset 3px 0 0 var(--stable)}
393
+ .route-card.p-add{box-shadow:inset 3px 0 0 rgba(124,196,255,.45);opacity:.92}
394
+
395
+ .node.p-btc{border-color:rgba(247,147,26,.55);background:linear-gradient(180deg, rgba(247,147,26,.14), rgba(11,16,24,.88))}
396
+ .node.p-btc .tag,.node.p-btc .name{color:#fbbf24}
397
+ .node.p-btc .chains{color:#fbbf24}
398
+ .node.p-btc:hover{border-color:#f7931a;box-shadow:0 12px 30px rgba(247,147,26,.14)}
399
+ .route-card.p-btc .where{color:#fbbf24}
400
+ .route-card.p-btc{box-shadow:inset 3px 0 0 #f7931a}
401
+
402
+ .node.p-base{border-color:rgba(0,82,255,.5);background:linear-gradient(180deg, rgba(0,82,255,.14), rgba(11,16,24,.88))}
403
+ .node.p-base .tag,.node.p-base .name{color:#7aa2ff}
404
+ .node.p-base .chains{color:#7aa2ff}
405
+ .node.p-base:hover{border-color:#0052ff;box-shadow:0 12px 30px rgba(0,82,255,.16)}
406
+ .route-card.p-base .where{color:#7aa2ff}
407
+ .route-card.p-base{box-shadow:inset 3px 0 0 #0052ff}
408
+ .node.p-evm{border-color:rgba(98,126,234,.5);background:linear-gradient(180deg, rgba(98,126,234,.14), rgba(11,16,24,.88))}
409
+ .node.p-evm .tag,.node.p-evm .name{color:#a5b4fc}
410
+ .node.p-evm .chains{color:#a5b4fc}
411
+ .node.p-evm:hover{border-color:#627eea;box-shadow:0 12px 30px rgba(98,126,234,.14)}
412
+ .route-card.p-evm .where{color:#a5b4fc}
413
+ .route-card.p-evm{box-shadow:inset 3px 0 0 #627eea}
414
+
415
+
416
+ .selfcustody{margin-top:clamp(34px,5vw,58px);padding-top:clamp(28px,4vw,40px);border-top:1px solid var(--line)}
417
+ .selfcustody h3{font-family:var(--display);font-weight:400;font-size:var(--fs-xl);line-height:1.12;margin-top:8px;max-width:24ch}
418
+ .selfcustody-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:clamp(18px,2.6vw,30px);margin-top:clamp(22px,3vw,32px)}
419
+ .selfcustody-grid h4{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;color:var(--blue2);font-weight:500;margin-bottom:8px}
420
+ .selfcustody-grid p{color:var(--cool);font-size:var(--fs-base);line-height:1.65;max-width:52ch}
421
+ .selfcustody-grid > *{opacity:0;transform:translate3d(0,18px,0);transition:opacity .55s var(--ease),transform .55s var(--ease)}
422
+ .selfcustody-grid > *:nth-child(1){transition-delay:.05s}
423
+ .selfcustody-grid > *:nth-child(2){transition-delay:.15s}
424
+ .selfcustody-grid > *:nth-child(3){transition-delay:.25s}
425
+ .selfcustody-grid > *:nth-child(4){transition-delay:.35s}
426
+ .selfcustody.in .selfcustody-grid > *{opacity:1;transform:none}
427
+ @media (max-width:760px){.selfcustody-grid{grid-template-columns:1fr}}
428
+ .moat-grid{
429
+ display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
430
+ gap:1px;background:var(--line);border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;
431
+ margin-top:22px;
432
+ }
433
+ .moat-card{
434
+ background:rgba(17,25,37,.94);padding:clamp(20px,3vw,28px);min-height:140px;
435
+ display:flex;flex-direction:column;gap:10px;
436
+ transition:background .35s;
437
+ }
438
+ .moat-card:hover{background:var(--panel-2)}
439
+ .moat-card .n{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
440
+ .moat-card h3{font-family:var(--display);font-weight:400;font-size:var(--fs-lg)}
441
+ .moat-card p{color:var(--cool);font-size:var(--fs-base);line-height:1.55;max-width:44ch}
442
+ @media (max-width:860px){.moat-grid{grid-template-columns:1fr}}
443
+
444
+ .strategy-surface{
445
+ margin-top:clamp(30px,5vw,52px);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;
446
+ background:linear-gradient(145deg,rgba(124,196,255,.07),rgba(17,25,37,.92) 40%,rgba(11,16,24,.98));
447
+ max-width:960px;margin-left:auto;margin-right:auto;
448
+ }
449
+ .strategy-head{display:flex;align-items:end;justify-content:space-between;gap:20px;padding:clamp(22px,3vw,34px);border-bottom:1px solid var(--line)}
450
+ .strategy-kicker{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
451
+ .strategy-head h3{font-family:var(--display);font-weight:400;font-size:var(--fs-xl);line-height:1.05;margin-top:8px}
452
+ .strategy-head p{max-width:50ch;color:var(--cool);font-size:var(--fs-sm);line-height:1.6}
453
+ .strategy-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1px;background:var(--line)}
454
+ .strategy-card{min-height:205px;padding:clamp(20px,2.6vw,28px);background:rgba(11,16,24,.96);display:flex;flex-direction:column;gap:11px}
455
+ .strategy-card .mode{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--blue2)}
456
+ .strategy-card h4{font-family:var(--display);font-weight:400;font-size:var(--fs-lg)}
457
+ .strategy-card p{color:var(--cool);font-size:var(--fs-sm);line-height:1.6}
458
+ .strategy-posture{padding:14px clamp(20px,3vw,34px);border-top:1px solid var(--line);font-family:var(--mono);font-size:var(--fs-micro);line-height:1.6;letter-spacing:.11em;text-transform:uppercase;color:var(--mute)}
459
+ .strategy-posture b{font-weight:500;color:var(--warm);letter-spacing:.04em}
460
+ @media (max-width:900px){
461
+ .strategy-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
462
+ .strategy-head{align-items:start;flex-direction:column}
463
+ .strategy-posture{padding:12px clamp(16px,2.5vw,28px)}
464
+ .route-proof{margin-top:14px}
465
+ .route-tree{width:100%;height:auto}
466
+ }
467
+
468
+ .strategy-posture b{color:var(--blue2);font-weight:500}
469
+ @media (max-width:980px){.strategy-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.strategy-head{align-items:start;flex-direction:column}}
470
+ @media (max-width:620px){.strategy-grid{grid-template-columns:1fr}.strategy-card{min-height:0}}
471
+
472
+ /* actual Oracle CLI */
473
+ .convert-grid{display:grid;grid-template-columns:1fr;gap:clamp(18px,3vw,28px);align-items:stretch;margin-top:8px}
474
+ .convert-copy{display:flex;flex-direction:column;gap:14px;text-align:left;max-width:780px}
475
+ .convert-copy h3{font-family:var(--display);font-weight:400;font-size:var(--fs-xl);line-height:1.1}
476
+ .convert-copy p{color:var(--cool);font-size:var(--fs-base);line-height:1.65;max-width:54ch}
477
+ .convert-pills{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}
478
+ .convert-pills span{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;border:1px solid rgba(124,196,255,.28);border-radius:999px;padding:8px 12px;color:var(--blue2)}
479
+ .platform-beta{display:block;max-width:56ch;font-family:var(--sans);font-size:var(--fs-sm);line-height:1.7;letter-spacing:0;color:var(--mute)}
480
+ .platform-beta b{float:left;margin:3px 10px 0 0;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:#071018;background:var(--blue2);border-radius:var(--r-pill);padding:4px 9px}
481
+ .app-shot-title{margin-top:clamp(34px,4.5vw,56px)}
482
+ .app-shot{margin-top:clamp(20px,2.6vw,30px);display:flex;flex-direction:column;gap:10px}
483
+ .app-shot{margin-top:12px}
484
+ .app-shot + .platform-beta{margin-top:14px}
485
+ .os-dl{display:flex;gap:14px;flex-wrap:wrap;margin-top:20px}
486
+ .os-link{font-family:var(--mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;padding:10px 18px;border:1px solid var(--line);border-radius:var(--r-sm);color:var(--warm);text-decoration:none;transition:border-color .2s}
487
+ .os-link:hover{border-color:var(--blue)}
488
+ .app-shot img{width:100%;height:auto;display:block;border-radius:var(--r-md);border:1px solid rgba(124,196,255,.2);box-shadow:0 24px 60px rgba(0,0,0,.45)}
489
+ .app-shot figcaption{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.12em;text-transform:uppercase;color:var(--mute)}
490
+
491
+ .cli-install{margin:0 0 22px;display:flex;flex-direction:column;gap:12px;align-items:flex-start}
492
+ .agent-caret{display:inline-block;width:2px;height:1.15em;margin-left:1px;vertical-align:-.2em;background:#7cc4ff;animation:agentblink 1s step-end infinite;flex:0 0 auto}
493
+ @keyframes agentblink{50%{opacity:0}}
494
+ .agent-prompt .agent-does,.agent-prompt .agent-out{opacity:0;transform:translateY(6px);transition:opacity .35s ease,transform .35s ease}
495
+ .agent-prompt .agent-does.in,.agent-prompt .agent-out.in{opacity:1;transform:none}
496
+ .agent-tool.working{position:relative}
497
+ .agent-tool.working::after{content:"";position:absolute;inset:-1px;border-radius:999px;border:1px solid rgba(124,196,255,.85);animation:agentpulse 1.1s ease-out infinite}
498
+ @keyframes agentpulse{from{opacity:.9;transform:scale(1)}to{opacity:0;transform:scale(1.35)}}
499
+ @media (prefers-reduced-motion:reduce){
500
+ .agent-caret{animation:none}
501
+ .agent-tool.working::after{animation:none}
502
+ .agent-prompt .agent-does,.agent-prompt .agent-out{opacity:1;transform:none;transition:none}
503
+ }
504
+ .agent-install{display:inline-flex;align-items:center;gap:14px;flex-wrap:wrap;margin:22px 0 0;padding:13px 18px;border:1px solid rgba(124,196,255,.3);border-radius:var(--r-sm);background:rgba(8,13,21,.7)}
505
+ .agent-install code{font-family:var(--mono);font-size:14px;color:var(--ink)}
506
+ .agent-install span{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.1em;text-transform:uppercase;color:var(--mute)}
507
+ .agent-install b{color:var(--dim);font-weight:600}
508
+ .agent-install .btn{font-family:var(--mono);font-size:13px;color:var(--ink);text-decoration:none;padding:7px 16px;border:1px solid rgba(124,196,255,.35);border-radius:999px;transition:background .2s var(--ease),border-color .2s var(--ease)}
509
+ .agent-install .btn:hover{background:rgba(124,196,255,.12);border-color:var(--blue)}
510
+ .agent-install .btn-claude{color:#d97706;border-color:rgba(217,119,6,.35)}
511
+ .agent-install .btn-claude:hover{background:rgba(217,119,6,.1);border-color:#d97706}
512
+ .agent-install .btn-chatgpt{color:#10a37f;border-color:rgba(16,163,127,.35)}
513
+ .agent-install .btn-chatgpt:hover{background:rgba(16,163,127,.1);border-color:#10a37f}
514
+ .agent-install .btn-cursor{color:#a855f7;border-color:rgba(168,85,247,.35)}
515
+ .agent-install .btn-cursor:hover{background:rgba(168,85,247,.1);border-color:#a855f7}
516
+ .agent-install .btn-vscode{color:#0078d4;border-color:rgba(0,120,212,.35)}
517
+ .agent-install .btn-vscode:hover{background:rgba(0,120,212,.1);border-color:#0078d4}
518
+ .agent-install .btn-copilot{color:#2ea44f;border-color:rgba(46,164,79,.35)}
519
+ .agent-install .btn-copilot:hover{background:rgba(46,164,79,.1);border-color:#2ea44f}
520
+ .harness-marquee{margin:24px 0 0}
521
+ .harness-marquee .track{gap:18px;padding:14px 0}
522
+ .harness-marquee .btn{font-family:var(--mono);font-size:13px;color:var(--ink);text-decoration:none;padding:8px 18px;border:1px solid rgba(124,196,255,.35);border-radius:999px;transition:background .2s var(--ease),border-color .2s var(--ease);white-space:nowrap}
523
+ .harness-marquee .btn:hover{background:rgba(124,196,255,.12);border-color:var(--blue)}
524
+ .harness-marquee .btn-claude{color:#d97706;border-color:rgba(217,119,6,.35)}
525
+ .harness-marquee .btn-claude:hover{background:rgba(217,119,6,.1);border-color:#d97706}
526
+ .harness-marquee .btn-chatgpt{color:#10a37f;border-color:rgba(16,163,127,.35)}
527
+ .harness-marquee .btn-chatgpt:hover{background:rgba(16,163,127,.1);border-color:#10a37f}
528
+ .harness-marquee .btn-cursor{color:#a855f7;border-color:rgba(168,85,247,.35)}
529
+ .harness-marquee .btn-cursor:hover{background:rgba(168,85,247,.1);border-color:#a855f7}
530
+ .harness-marquee .btn-vscode{color:#0078d4;border-color:rgba(0,120,212,.35)}
531
+ .harness-marquee .btn-vscode:hover{background:rgba(0,120,212,.1);border-color:#0078d4}
532
+ .harness-marquee .btn-copilot{color:#2ea44f;border-color:rgba(46,164,79,.35)}
533
+ .harness-marquee .btn-copilot:hover{background:rgba(46,164,79,.1);border-color:#2ea44f}
534
+ .harness-marquee code{font-family:var(--mono);font-size:13px;color:var(--cool);white-space:nowrap}
535
+ .agent-prompts{display:grid;grid-template-columns:repeat(auto-fit,minmax(380px,1fr));gap:22px;margin:32px 0 0}
536
+ .agent-prompt{padding:0;text-align:left}
537
+ .agent-chips{display:flex;align-items:center;gap:8px;margin:0 0 12px}
538
+ .agent-chip{font-family:var(--mono);font-size:11.5px;letter-spacing:.04em;color:var(--dim);border:1px solid var(--line);border-radius:8px;padding:5px 11px;background:rgba(255,255,255,.02)}
539
+ /* Real app composers. Text is positioned in % of the shot so it tracks the
540
+ image at every width -- derived from measured pixel geometry:
541
+ claude.png 1610x264 text band y136-160, left inset x54
542
+ codex.png 1490x204 text band y42-64, left inset x84 */
543
+ .agent-shot{margin:0}
544
+ /* Claude and Codex composers rebuilt 1:1 in DOM from DEMI's screenshots.
545
+ Real elements, so they stay crisp at any width -- a 1474px PNG could only
546
+ ever be downscaled. Colours and geometry sampled from the source images:
547
+ Claude field #292929 on #161716, radius ~37px, coral #d87656 accent;
548
+ Codex field #2c2c2a on #20201f, radius ~9px, amber "Auto". */
549
+ .agent-panel{margin:0;padding:20px;border-radius:14px}
550
+ .is-claude{background:#161716}
551
+ .is-codex{background:#20201f}
552
+ .agent-panel .ai{width:19px;height:19px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
553
+ .agent-spacer{flex:1}
554
+ .agent-line{display:flex;align-items:center;min-height:26px;font-family:var(--sans);font-size:19px;line-height:1.4;color:#ececec;overflow-wrap:anywhere}
555
+ .agent-typed:empty::before{content:attr(data-ph);color:#8b8b8b}
556
+ .agent-caret{display:inline-block;width:2px;height:1.15em;margin-left:2px;background:#c9c9c9;animation:agentblink 1.05s step-end infinite;flex:0 0 auto}
557
+ .agent-bar{display:flex;align-items:center;gap:13px}
558
+ @keyframes agentblink{50%{opacity:0}}
559
+
560
+ /* Claude: one rounded field, controls on the bottom row inside it. */
561
+ .is-claude .agent-box{background:#292929;border-radius:26px;padding:18px 20px 14px}
562
+ .is-claude .agent-line{margin:0 0 22px}
563
+ .is-claude .agent-bar{color:#9a9a9a}
564
+ .ca-access{display:inline-flex;align-items:center;gap:7px;color:#e0763f;font-size:15px}
565
+ .ca-model{display:inline-flex;align-items:center;gap:9px;font-size:15px}
566
+ .ca-model b{color:#ededed;font-weight:600}
567
+ .ca-model span{color:#8f8f8f}
568
+ .ca-orb{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;background:#fff;color:#1a1a1a;transition:transform .2s ease}
569
+ .ca-orb svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
570
+ .agent-panel.sent .ca-orb{transform:scale(1.12)}
571
+
572
+ /* Codex: chips above, bordered field, controls below it. */
573
+ .cx-chips{display:flex;align-items:center;gap:9px;margin:0 0 12px}
574
+ .cx-chip{display:inline-flex;align-items:center;gap:7px;padding:7px 12px;border-radius:9px;background:#2f2f2e;color:#d6d6d4;font-size:14px}
575
+ .cx-chip .ai{width:16px;height:16px;opacity:.75}
576
+ .cx-sq{padding:7px 9px}
577
+ .is-codex .agent-box{display:flex;align-items:center;gap:12px;background:#2c2c2a;border:1px solid #4a4a48;border-radius:12px;padding:15px 16px;transition:border-color .3s ease}
578
+ .is-codex .agent-box.focus{border-color:#6f6f6c}
579
+ .is-codex .agent-line{flex:1;min-width:0}
580
+ .cx-return{color:#8b8b89}
581
+ .is-codex .agent-bar{margin:13px 0 0;color:#8b8b89;gap:12px}
582
+ .cx-auto{color:#e3b341;font-size:14px}
583
+ .cx-model,.cx-eff{color:#c8c8c6;font-size:14px}
584
+ .cx-ring{width:15px;height:15px;border-radius:50%;border:1.7px solid #6f6f6c;border-right-color:transparent;flex:0 0 auto}
585
+
586
+ @media (max-width:640px){
587
+ .agent-line{font-size:16px}
588
+ .is-claude .agent-box{padding:14px 15px 11px;border-radius:20px}
589
+ .agent-bar{gap:9px}
590
+ .ca-model span,.cx-eff{display:none}
591
+ }
592
+ .agent-prompt .agent-does,.agent-prompt .agent-out{opacity:0;transform:translateY(6px);transition:opacity .35s ease,transform .35s ease}
593
+ .agent-prompt .agent-does.in,.agent-prompt .agent-out.in{opacity:1;transform:none}
594
+ .agent-tool.working{position:relative}
595
+ .agent-tool.working::after{content:"";position:absolute;inset:-1px;border-radius:999px;border:1px solid rgba(124,196,255,.85);animation:agentpulse 1.1s ease-out infinite}
596
+ @keyframes agentpulse{from{opacity:.9;transform:scale(1)}to{opacity:0;transform:scale(1.35)}}
597
+ @media (prefers-reduced-motion:reduce){
598
+ .agent-caret{animation:none}
599
+ .agent-tool.working::after{animation:none}
600
+ .agent-prompt .agent-does,.agent-prompt .agent-out{opacity:1;transform:none;transition:none}
601
+ }
602
+ .agent-install{display:inline-flex;align-items:center;gap:14px;flex-wrap:wrap;margin:22px 0 0;padding:13px 18px;border:1px solid rgba(124,196,255,.3);border-radius:var(--r-sm);background:rgba(8,13,21,.7)}
603
+ .agent-install code{font-family:var(--mono);font-size:14px;color:var(--ink)}
604
+ .agent-install span{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.1em;text-transform:uppercase;color:var(--mute)}
605
+ .agent-install b{color:var(--dim);font-weight:600}
606
+ .agent-prompts{display:grid;grid-template-columns:1fr;gap:34px;margin:32px 0 0}
607
+ .agent-prompt{padding:0;text-align:left}
608
+ .agent-chips{display:flex;align-items:center;gap:8px;margin:0 0 12px}
609
+ .agent-chip{font-family:var(--mono);font-size:11.5px;letter-spacing:.04em;color:var(--dim);border:1px solid var(--line);border-radius:8px;padding:5px 11px;background:rgba(255,255,255,.02)}
610
+ /* Real app composers. Text is positioned in % of the shot so it tracks the
611
+ image at every width -- derived from measured pixel geometry:
612
+ claude.png 1610x264 text band y136-160, left inset x54
613
+ codex.png 1490x204 text band y42-64, left inset x84 */
614
+ .agent-shot{margin:0}
615
+ .agent-frame{position:relative;container-type:inline-size;overflow:hidden}
616
+ .is-claude .agent-frame{border-radius:2.5cqw}
617
+ .is-codex .agent-frame{border-radius:.6cqw}
618
+ .agent-frame img{display:block;width:100%;height:auto}
619
+ .agent-type{position:absolute;display:flex;align-items:center;white-space:nowrap;overflow:hidden;pointer-events:none}
620
+ .is-claude .agent-type{left:5.22%;right:6%;top:17.7%;height:16.2%;font-family:var(--sans);font-size:1.02cqw;color:#f5f6f6}
621
+ .is-codex .agent-type{left:1.30%;right:6%;top:44.4%;height:19.4%;font-family:var(--sans);font-size:0.98cqw;color:#f5f4ee}
622
+ .agent-caret{display:inline-block;width:2px;height:1.05em;margin-left:2px;animation:agentblink 1s step-end infinite;flex:0 0 auto}
623
+ .is-claude .agent-caret{background:#f5f6f6}
624
+ .is-codex .agent-caret{background:#d87656}
625
+ @keyframes agentblink{50%{opacity:0}}
626
+ .agent-ask{margin:14px 0 16px;font-size:19px;line-height:1.45;color:var(--ink)}
627
+ .agent-does{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:14px 0 0;padding:11px 14px;border-radius:10px;background:rgba(8,13,21,.6);border:1px solid rgba(124,196,255,.18)}
628
+ .agent-tool{font-family:var(--mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#7cc4ff;border:1px solid rgba(124,196,255,.4);border-radius:999px;padding:3px 9px;flex:0 0 auto}
629
+ .agent-does code{font-family:var(--mono);font-size:13px;color:var(--ink);overflow-wrap:anywhere}
630
+ .agent-out{margin:16px 0 0;font-family:var(--mono);font-size:14.5px;line-height:1.65;color:var(--dim)}
631
+ .agent-out b{color:var(--ink);font-weight:600}
632
+ .agent-caption{margin:20px 0 0;color:var(--mute);font-size:14px}
633
+ .agent-caption code{font-family:var(--mono);font-size:12.5px;color:var(--dim)}
634
+ @media (max-width:640px){.agent-prompts{grid-template-columns:1fr}.agent-ask{font-size:17px}}
635
+ .cli-install-hint{display:block;margin-top:8px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.12em;text-transform:uppercase;color:var(--mute)}
636
+ .cli-install-cmd{padding:16px 20px;border-radius:var(--r-sm);border:1px solid rgba(124,196,255,.34);background:rgba(17,25,37,.9);max-width:100%;overflow-x:auto}
637
+ .cli-install-cmd code{font-family:var(--mono);font-size:var(--fs-base);letter-spacing:.02em;color:var(--blue2);white-space:nowrap}
638
+ .cli-install-gate{display:block;font-family:var(--sans);font-size:var(--fs-sm);letter-spacing:0;color:var(--mute);margin:0;line-height:1.7}
639
+ .cli-install-gate b{display:inline;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:#071018;background:var(--blue2);border-radius:var(--r-pill);padding:4px 9px;white-space:nowrap}
640
+ .cli-install-gate a{color:var(--blue2);text-decoration:underline;text-underline-offset:3px}
641
+ .cli-frame{border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:#0d1420;box-shadow:0 24px 60px rgba(0,0,0,.35)}
642
+ .cli-frame img{display:block;width:100%;height:auto}
643
+ .cli-cap{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);margin-top:10px;text-align:left}
644
+ .cli-code{margin-top:14px;padding:14px 16px;border-radius:var(--r-sm);border:1px solid var(--line);background:rgba(17,25,37,.9);font-family:var(--mono);font-size:var(--fs-xs);line-height:1.55;color:var(--cool);overflow-x:auto;text-align:left}
645
+ .cli-code b{color:var(--blue2);font-weight:500}
646
+
647
+ .evolve-rail{
648
+ display:flex;flex-wrap:wrap;gap:8px;justify-content:center;
649
+ padding:14px 16px 4px;
650
+ }
651
+ .evolve-pill{
652
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;
653
+ border:1px solid var(--line);border-radius:999px;padding:8px 12px;color:var(--cool);
654
+ }
655
+ .evolve-pill.on{border-color:rgba(124,196,255,.35);color:var(--blue2)}
656
+
657
+ .wires{height:40px;position:relative}
658
+ .wires svg{width:100%;height:100%;display:block;overflow:visible}
659
+ .wires path{
660
+ fill:none;stroke:rgba(124,196,255,.58);stroke-width:1.5;stroke-linecap:round;
661
+ stroke-dasharray:1;stroke-dashoffset:1;
662
+ transition:stroke-dashoffset 1.3s var(--ease);
663
+ }
664
+ .wires.in path{stroke-dashoffset:0}
665
+ .wires path.w-2{transition-delay:.12s}
666
+ .wires path.w-3{transition-delay:.2s}
667
+ .wires path.w-4{transition-delay:.28s}
668
+ .wires path.w-5{transition-delay:.36s}
669
+ .wires circle{fill:var(--blue);opacity:0;transition:opacity .5s var(--ease) .7s}
670
+ .wires.in circle{opacity:1}
671
+ .wires.multi path.w-poly{stroke:rgba(59,130,246,.55)}
672
+ .wires.multi path.w-hl{stroke:rgba(80,210,193,.55)}
673
+ .wires.multi path.w-rh{stroke:rgba(215,255,77,.6)}
674
+ .wires.multi path.w-sol{stroke:rgba(153,69,255,.55)}
675
+ .wires.multi circle.c-poly{fill:var(--poly)}
676
+ .wires.multi circle.c-hl{fill:var(--hl)}
677
+ .wires.multi circle.c-rh{fill:var(--rh)}
678
+ .wires.multi circle.c-sol{fill:var(--sol)}
679
+
680
+ /* Live lanes. The wires draw once on scroll and then sit still, which reads as
681
+ a diagram rather than a control plane moving traffic. A second stroked copy
682
+ of each path runs a short dash along it on a loop, so every lane shows flow
683
+ in its own colour. Pure CSS on paths that already exist -- no extra DOM. */
684
+ .wires.in path{animation:lane-flow 2.6s linear infinite}
685
+ .wires.in path.w-2{animation-delay:.35s}
686
+ .wires.in path.w-3{animation-delay:.7s}
687
+ .wires.in path.w-4{animation-delay:1.05s}
688
+ .wires.in path.w-5{animation-delay:1.4s}
689
+ @keyframes lane-flow{
690
+ 0%{stroke-dasharray:.16 .84;stroke-dashoffset:1}
691
+ 100%{stroke-dasharray:.16 .84;stroke-dashoffset:0}
692
+ }
693
+ /* The endpoint dots breathe so the lane reads as connected, not decorative. */
694
+ .wires.in circle{animation:lane-node 2.6s var(--ease) infinite}
695
+ @keyframes lane-node{0%,100%{opacity:.55;r:1.4}50%{opacity:1;r:1.8}}
696
+ @media (prefers-reduced-motion:reduce){
697
+ .wires.in path,.wires.in circle{animation:none}
698
+ .wires.in path{stroke-dasharray:1;stroke-dashoffset:0}
699
+ }
700
+
701
+ /* route detail cards */
702
+ .route-card{background:rgba(17,25,37,.94);
703
+ background:var(--bg);padding:22px 20px;min-height:150px;
704
+ display:flex;flex-direction:column;gap:10px;transition:background .35s;
705
+ }
706
+ .route-card:hover{background:var(--panel-2)}
707
+ .route-card h3{font-family:var(--display);font-weight:400;font-size:var(--fs-lg);display:flex;align-items:center;gap:10px}
708
+ .route-card h3 img{width:20px;height:20px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
709
+ .route-card .where{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--blue)}
710
+ .route-card p{color:var(--cool);font-size:var(--fs-base);line-height:1.55}
711
+ .route-card .chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto}
712
+ .route-card.p-add{grid-column:1/-1;align-items:center;text-align:center;justify-content:center;gap:14px;padding:30px 22px}
713
+ .route-card.p-add .chips{justify-content:center;margin-top:4px}
714
+ .route-card.p-add p{max-width:46ch}
715
+ .chip-s{
716
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.1em;text-transform:uppercase;
717
+ border:1px solid var(--line);border-radius:999px;padding:5px 8px;color:var(--cool);
718
+ }
719
+ .band-head{max-width:var(--max);margin:96px auto 0;padding:0 var(--pad)}
720
+ .band-head .eyebrow{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:3.4px;text-transform:uppercase;color:var(--mute);margin-bottom:10px}
721
+ .band-head h2{font-family:var(--display);font-weight:400;font-size:var(--fs-2xl);line-height:1.06;letter-spacing:-.01em}
722
+ @media (max-width:760px){.band-head{margin-top:60px}}
723
+ .why-band{
724
+ border-top:1px solid var(--line);
725
+ padding:22px 24px 24px;
726
+ background:rgba(11,16,24,.55);
727
+ }
728
+ .why-band p{
729
+ max-width:62ch;margin:0 auto;text-align:center;
730
+ font-family:var(--display);font-style:italic;font-weight:400;
731
+ font-size:var(--fs-md);line-height:1.4;color:var(--blue2);
732
+ }
733
+ .why-band span{
734
+ display:block;margin-top:10px;
735
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);font-style:normal;
736
+ }
737
+
738
+ /* chains */
739
+ .chain-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
740
+ .chain{transition:border-color .5s var(--ease),transform .5s var(--ease),background .5s var(--ease)}
741
+ .chain:hover{transform:translateY(-2px);border-color:color-mix(in oklab,var(--blue) 34%,transparent)}
742
+ .chain .badge{font-variant-numeric:tabular-nums;letter-spacing:.1em}
743
+ .chain .badge:not(.live){opacity:.62;border-style:dashed}
744
+ .hl-surface{margin-top:34px;border:1px solid var(--line);border-radius:var(--r-md);padding:20px;background:rgba(124,196,255,.02)}
745
+ .hl-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:16px}
746
+ .hl-grid article{border:1px solid rgba(124,196,255,.22);border-radius:var(--r-sm);padding:16px 17px;background:rgba(17,25,37,.92)}
747
+ .hl-grid h3{font-family:var(--display);font-size:var(--fs-base);font-weight:500;color:var(--ink);margin:0 0 6px}
748
+ .hl-grid p{font-size:var(--fs-sm);line-height:1.6;color:var(--cool);margin:0}
749
+ .hl-note{margin:16px 0 0;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.04em;color:var(--cool);opacity:.62}
750
+ .hip3{margin-top:20px;padding-top:18px;border-top:1px solid var(--line)}
751
+ .hl-note code{font-family:var(--mono);color:var(--blue2);opacity:.9}
752
+ @media(max-width:900px){.hl-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
753
+ @media(max-width:620px){.hl-grid{grid-template-columns:1fr}}
754
+ .chain{
755
+ border:1px solid var(--line);border-radius:var(--r-md);padding:16px;
756
+ background:linear-gradient(180deg, rgba(124,196,255,.06), transparent 55%), rgba(17,25,37,.94);
757
+ min-height:100px;display:flex;flex-direction:column;justify-content:space-between;gap:12px;
758
+ transition:border-color .4s var(--ease),transform .4s var(--ease),box-shadow .4s var(--ease);
759
+ }
760
+ .chain:hover{border-color:rgba(124,196,255,.45);transform:translate3d(0,-3px,0)}
761
+ .chain-top{display:flex;justify-content:space-between;gap:8px;align-items:flex-start}
762
+ .chain .nm{font-family:var(--display);font-size:var(--fs-md);display:flex;align-items:center;gap:8px}
763
+ .chain .nm img{width:18px;height:18px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
764
+ .chain .id{font-family:var(--mono);font-size:var(--fs-xs);color:var(--blue);white-space:nowrap;padding-top:4px}
765
+ .chain .meta{
766
+ display:flex;justify-content:space-between;gap:8px;
767
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.12em;text-transform:uppercase;color:var(--mute);
768
+ }
769
+ .badge{border:1px solid var(--line);border-radius:999px;padding:4px 8px;color:var(--cool)}
770
+ .badge.live{border-color:rgba(124,196,255,.35);color:var(--blue)}
771
+
772
+ .venues{margin-top:14px;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:rgba(17,25,37,.85)}
773
+ .venues{background:rgba(17,25,37,.86);border:1px solid rgba(124,196,255,.16);border-radius:var(--r-md);overflow:hidden;margin-bottom:14px}
774
+ .venues-head{
775
+ padding:11px 14px;border-bottom:1px solid var(--line);
776
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
777
+ display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;
778
+ }
779
+ .venues-head b{color:var(--blue);font-weight:500}
780
+ .marquee{overflow:hidden;white-space:nowrap;mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent);-webkit-mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent)}
781
+ .marquee:hover .track{animation-play-state:paused}
782
+ .marquee + .marquee{border-top:1px solid rgba(124,196,255,.08)}
783
+ .track{display:inline-flex;gap:26px;padding:12px 0;animation:scroll var(--marquee-duration,240s) linear infinite;will-change:transform;transform:translate3d(0,0,0);backface-visibility:hidden;perspective:1000px}
784
+ .marquee.rev .track{animation-direction:reverse}
785
+ a.chip{text-decoration:none;color:inherit}
786
+ .chip{
787
+ display:inline-flex;align-items:center;gap:10px;
788
+ font-size:var(--fs-base);letter-spacing:-.015em;text-transform:none;color:var(--proto-color,var(--cool));
789
+ padding:8px 13px;border:1px solid rgba(124,196,255,.1);border-radius:999px;background:rgba(11,16,24,.38);
790
+ box-shadow:inset 0 0 0 1px rgba(255,255,255,.025);
791
+ transition:border-color .35s var(--ease),background .35s var(--ease),transform .35s var(--ease);
792
+ }
793
+ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);transform:translate3d(0,-2px,0)}
794
+ .chip img{width:18px;height:18px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
795
+ .chip.wm-chip{padding:11px 18px}
796
+ .chip img.wm{width:auto;height:27px;max-width:180px;border-radius:0;object-fit:contain;background:none;opacity:1}
797
+ .chip img.wm.tall{width:30px;height:30px;min-width:30px;max-width:30px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.08);box-shadow:inset 0 0 0 1px rgba(255,255,255,.08)}
798
+ .chip img.wm.mono{filter:brightness(0) invert(1)}
799
+
800
+ .chip .wordmark{font-family:var(--proto-font,var(--sans));font-weight:var(--proto-weight,750);font-style:var(--proto-style,normal);text-transform:var(--proto-transform,none);letter-spacing:var(--proto-track,-.025em);line-height:1.2}
801
+ .proto-uniswap{--proto-font:"Inter",var(--sans);--proto-color:#ff4dcb;--proto-weight:850}
802
+ .proto-hyperliquid{--proto-font:var(--display);--proto-style:italic;--proto-color:#50d2c1;--proto-weight:500;--proto-track:.01em}
803
+ .proto-polymarket{--proto-font:"Manrope",var(--sans);--proto-color:#7aa7ff;--proto-weight:800;--proto-track:-.035em}
804
+ .proto-aerodrome,.proto-velodrome{--proto-font:"Space Grotesk",var(--sans);--proto-color:#f2f7ff;--proto-weight:700;--proto-transform:lowercase}
805
+ .proto-pancakeswap{--proto-font:"DM Sans",var(--sans);--proto-color:#d1884f;--proto-weight:700}
806
+ .proto-quickswap{--proto-font:"Archivo Black",var(--sans);--proto-color:#35a7ff;--proto-weight:800;--proto-transform:uppercase;--proto-track:.005em}
807
+ .proto-lfj{--proto-font:"Sora",var(--sans);--proto-color:#ff6357;--proto-weight:700;--proto-transform:uppercase;--proto-track:.05em}
808
+ .proto-hyperswap{--proto-font:"Space Grotesk",var(--sans);--proto-color:#69f0d8;--proto-weight:700}
809
+ .proto-curve{--proto-font:"Times New Roman",serif;--proto-color:#f7f3dd;--proto-weight:700;--proto-track:.01em}
810
+ .proto-balancer{--proto-font:"Inter",var(--sans);--proto-color:#f6f6f6;--proto-weight:850;--proto-track:-.055em}
811
+ .proto-pendle{--proto-font:"Sora",var(--sans);--proto-color:#a7f3d0;--proto-weight:700}
812
+ .proto-morpho{--proto-font:"Manrope",var(--sans);--proto-color:#75b9ff;--proto-weight:800;--proto-track:-.04em}
813
+ .proto-gmx{--proto-font:"Archivo Black",var(--sans);--proto-color:#41d3ff;--proto-weight:800;--proto-transform:uppercase;--proto-track:.04em}
814
+ .proto-lifi{--proto-font:"Inter",var(--sans);--proto-color:#d8b4fe;--proto-weight:850;--proto-transform:uppercase;--proto-track:.02em}
815
+ .proto-relay{--proto-font:"Space Grotesk",var(--sans);--proto-color:#f2f7ff;--proto-weight:700;--proto-transform:lowercase}
816
+ .proto-paraswap{--proto-font:"Manrope",var(--sans);--proto-color:#ff9a76;--proto-weight:800}
817
+ .proto-odos{--proto-font:"Sora",var(--sans);--proto-color:#f0f9ff;--proto-weight:700;--proto-transform:lowercase}
818
+ .proto-cow{--proto-font:"DM Sans",var(--sans);--proto-color:#fcd34d;--proto-weight:700}
819
+ .proto-oneinch{--proto-font:"Inter",var(--sans);--proto-color:#9ec5ff;--proto-weight:850;--proto-track:-.045em}
820
+ .proto-jupiter{--proto-font:"Space Grotesk",var(--sans);--proto-color:#f6a5ff;--proto-weight:700}
821
+ .proto-across{--proto-font:"Manrope",var(--sans);--proto-color:#ff6b9b;--proto-weight:800}
822
+ .proto-stargate{--proto-font:"Sora",var(--sans);--proto-color:#9ddcff;--proto-weight:700}
823
+ .proto-magic-eden{--proto-font:"Archivo Black",var(--sans);--proto-color:#dfc7ff;--proto-weight:800;--proto-track:.01em}
824
+ @keyframes scroll{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}
825
+
826
+
827
+
828
+ /* dense premium layer: protocol atlas + hero metrics */
829
+ .home-stats{margin-top:clamp(40px,6vw,72px);border-top:1px solid var(--line);padding-top:26px;
830
+ display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;
831
+ width:100%;margin:28px 0 0;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;
832
+ background:var(--line);position:relative;z-index:3;box-shadow:0 24px 70px rgba(0,0,0,.28);
833
+ }
834
+ .home-stat{background:rgba(17,25,37,.82);padding:15px 16px 14px;text-align:left;min-height:86px;position:relative;overflow:hidden}
835
+ .home-stat::after{content:"";position:absolute;inset:-1px;opacity:0;background:radial-gradient(160px 120px at var(--mx,50%) var(--my,50%),rgba(124,196,255,.16),transparent 65%);transition:opacity .35s var(--ease)}
836
+ .home-stat:hover::after{opacity:1}
837
+ .home-stat b{display:block;font-family:var(--display);font-weight:400;font-size:var(--fs-2xl);line-height:.9;color:var(--ink);letter-spacing:-.03em;position:relative;z-index:1}
838
+ .home-stat .stat-suffix{font-size:.42em;letter-spacing:0;color:var(--cool);margin-left:.18em;vertical-align:.42em}
839
+ .home-stat span{display:block;margin-top:9px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);position:relative;z-index:1}
840
+
841
+ .protocol-atlas{max-width:min(1280px,100%)}
842
+ .protocol-atlas .section-title{max-width:15ch;font-size:var(--fs-3xl);line-height:.94;letter-spacing:-.035em}
843
+ .protocol-atlas .section-lede{max-width:62ch}
844
+ .atlas-sticky{position:sticky;top:96px;border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;background:linear-gradient(180deg,rgba(124,196,255,.10),rgba(17,25,37,.88) 42%,rgba(11,16,24,.94));box-shadow:0 30px 90px rgba(0,0,0,.34)}
845
+ .atlas-orbit{height:220px;position:relative;display:grid;place-items:center;border-bottom:1px solid var(--line);overflow:hidden}
846
+ .atlas-orbit::before{content:"";position:absolute;width:360px;height:360px;border-radius:50%;background:radial-gradient(circle,rgba(124,196,255,.24),rgba(124,196,255,.08) 28%,transparent 62%);filter:blur(12px);animation:home-breathe 5.8s var(--ease) infinite}
847
+ .atlas-orbit .orbital{width:124px;height:124px;filter:drop-shadow(0 0 32px rgba(124,196,255,.4))}
848
+ .atlas-copy{padding:clamp(20px,3vw,30px)}
849
+ .atlas-count{font-family:var(--display);font-weight:300;font-size:var(--fs-4xl);line-height:.82;letter-spacing:-.055em;color:var(--ink)}
850
+ .atlas-count span{font-style:italic;color:var(--blue2)}
851
+ .atlas-sub{margin-top:16px;color:var(--cool);font-size:var(--fs-base);line-height:1.68;max-width:34ch}
852
+ .atlas-ledger{display:grid;gap:1px;margin-top:24px;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:var(--line)}
853
+ .atlas-ledger div{display:grid;grid-template-columns:1fr auto;gap:16px;padding:11px 13px;background:rgba(11,16,24,.62);font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.13em;text-transform:uppercase;color:var(--mute)}
854
+ .atlas-ledger b{color:var(--blue2);font-weight:500}
855
+ .mega-oracle{font-family:var(--display);font-weight:300;font-size:var(--fs-4xl);line-height:.8;letter-spacing:-.06em;text-align:center;color:transparent;-webkit-text-stroke:1px rgba(124,196,255,.20);margin:clamp(54px,9vw,110px) auto -26px;max-width:1280px;mask-image:linear-gradient(180deg,#000 28%,transparent 96%);-webkit-mask-image:linear-gradient(180deg,#000 28%,transparent 96%)}
856
+
857
+ @media (max-width:960px){
858
+ .home-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
859
+ .atlas-sticky{position:relative;top:auto}
860
+ }
861
+ @media (max-width:560px){.home-stats{grid-template-columns:1fr}.home-stat{min-height:0}.atlas-orbit{height:170px}.atlas-count{font-size:var(--fs-3xl)}}
862
+
863
+
864
+
865
+ /* high-end motion surface, replaces visible DEX/lending lists */
866
+ .motion-lab{display:grid;grid-template-columns:minmax(280px,.72fr) minmax(0,1.55fr);gap:clamp(22px,4vw,54px);align-items:start;margin-top:clamp(26px,5vw,58px);perspective:1200px}
867
+ .motion-main{display:flex;flex-direction:column;gap:16px;min-width:0}
868
+ .motion-command{transform-style:preserve-3d}
869
+ .toolbelt{display:flex;flex-wrap:wrap;gap:8px;border:1px solid var(--line);border-radius:999px;padding:9px;background:rgba(11,16,24,.5);box-shadow:inset 0 0 0 1px rgba(255,255,255,.02);overflow:hidden}
870
+ .toolbelt span{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--blue2);border:1px solid rgba(124,196,255,.18);border-radius:999px;padding:8px 10px;background:rgba(124,196,255,.045);white-space:nowrap}
871
+ .operator-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
872
+ .motion-card{--mx:50%;--my:50%;position:relative;min-height:252px;border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;padding:clamp(20px,3vw,30px);background:linear-gradient(155deg,rgba(124,196,255,.095),rgba(17,25,37,.84) 34%,rgba(11,16,24,.96));box-shadow:0 30px 90px rgba(0,0,0,.22);transform-style:preserve-3d;will-change:transform;transition:transform .55s var(--ease),border-color .45s var(--ease),box-shadow .45s var(--ease)}
873
+ .motion-card::before{content:"";position:absolute;inset:-40%;opacity:.62;background:radial-gradient(340px 220px at var(--mx) var(--my),rgba(184,240,255,.18),transparent 58%),conic-gradient(from var(--spin,0deg),transparent,rgba(124,196,255,.24),transparent 34%,rgba(80,210,193,.18),transparent 66%);filter:blur(26px);transform:translateZ(-1px);animation:card-spin 12s linear infinite}
874
+ .motion-card::after{content:"";position:absolute;inset:0;background:linear-gradient(120deg,transparent 0%,rgba(255,255,255,.08) 44%,transparent 58%);transform:translateX(-120%);transition:transform .9s var(--ease);pointer-events:none}
875
+ .motion-card:hover{border-color:rgba(184,240,255,.38);box-shadow:0 34px 110px rgba(0,0,0,.34),0 0 0 1px rgba(184,240,255,.06)}
876
+ .motion-card:hover::after{transform:translateX(120%)}
877
+ .motion-card .num{position:relative;z-index:1;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
878
+ .motion-card h3{position:relative;z-index:1;margin:44px 0 12px;font-family:var(--display);font-weight:400;font-size:var(--fs-2xl);line-height:.96;letter-spacing:-.03em}
879
+ .motion-card p{position:relative;z-index:1;color:var(--cool);font-size:var(--fs-base);line-height:1.62;max-width:34ch}
880
+ .motion-card .sig{position:absolute;left:clamp(20px,3vw,30px);right:clamp(20px,3vw,30px);bottom:18px;z-index:1;display:flex;justify-content:space-between;gap:14px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;color:var(--mute);border-top:1px solid rgba(124,196,255,.12);padding-top:13px}
881
+ .motion-card.is-hot .sig span:last-child{color:var(--blue2)}
882
+ .motion-scan{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent,rgba(124,196,255,.08),transparent);height:38%;animation:scan-pass 4.8s var(--ease) infinite;mix-blend-mode:screen}
883
+ .word-mask{display:inline-block;overflow:hidden;vertical-align:bottom;padding-bottom:.16em;margin-bottom:-.16em}.word-mask>span{display:inline-block}
884
+ @keyframes card-spin{to{--spin:360deg}}
885
+ @keyframes scan-pass{0%,100%{transform:translateY(-115%);opacity:0}18%,70%{opacity:.7}100%{transform:translateY(215%);opacity:0}}
886
+ @media (max-width:960px){.motion-lab{grid-template-columns:1fr}.operator-grid{grid-template-columns:1fr}.toolbelt{border-radius:var(--r-md)}.motion-card{min-height:220px}}
887
+ @media (prefers-reduced-motion:reduce){.motion-card::before,.motion-scan{animation:none}.motion-card{will-change:auto}}
888
+
889
+ /* ── hero: product-first split. Real artifact leads, orb is ambience ── */
890
+ .hero-split{
891
+ display:grid;grid-template-columns:minmax(0,.68fr) minmax(0,1.32fr);
892
+ gap:clamp(28px,4vw,56px);align-items:center;text-align:left;width:100%;
893
+ }
894
+ .hero-lede{min-width:0;display:flex;flex-direction:column;align-items:flex-start}
895
+ .hero-lede .home-kicker{margin-bottom:14px}
896
+ .hero-split .home-title{
897
+ font-size:var(--fs-3xl);line-height:.98;letter-spacing:-.035em;
898
+ text-transform:none;text-align:left;margin:0;
899
+ }
900
+ .hero-sub{
901
+ max-width:46ch;margin:20px 0 0;color:var(--cool);
902
+ font-size:var(--fs-base);line-height:1.65;text-shadow:0 1px 20px rgba(0,0,0,.6);
903
+ }
904
+ .hero-split .home-actions{justify-content:flex-start;margin-top:30px}
905
+ .enter-cta.primary{
906
+ background:linear-gradient(180deg,rgba(184,240,255,.98),rgba(124,196,255,.9));
907
+ color:#071018;border-color:transparent;font-weight:600;
908
+ }
909
+ .enter-cta.primary::after{color:#071018}
910
+ .enter-cta.primary:hover{box-shadow:0 0 0 1px rgba(184,240,255,.4),0 22px 54px rgba(124,196,255,.22)}
911
+ .enter-cta.ghost{background:none}
912
+ .hero-note-line{
913
+ margin-top:18px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;
914
+ text-transform:uppercase;color:var(--mute);
915
+ }
916
+ .hero-note-line code{color:var(--blue2);font-size:var(--fs-micro)}
917
+
918
+ .hero-product{position:relative;margin:0;min-width:0;perspective:1600px;overflow:clip}
919
+ .hero-product .hero-art{display:none}
920
+ .hero-product .hero-orb{width:min(100%,560px)}
921
+ .hero-shot{
922
+ position:relative;z-index:1;border-radius:var(--r-md);overflow:hidden;
923
+ border:1px solid var(--line-2);background:#05080D;
924
+ box-shadow:0 40px 120px rgba(0,0,0,.62),0 0 0 1px rgba(184,240,255,.06),inset 0 1px 0 rgba(255,255,255,.05);
925
+ transform:perspective(2000px) rotateY(-4deg) rotateX(1.5deg);
926
+ transition:transform 1s var(--ease),box-shadow 1s var(--ease);
927
+ /* Bleed toward the viewport edge so the shot reads at a legible size. */
928
+ width:calc(100% + max(0px,(100vw - var(--max))/2 - var(--pad) + 20px));
929
+ max-width:none;
930
+ }
931
+ .hero-shot img{display:block;width:100%;height:auto}
932
+ .hero-shot::after{
933
+ content:"";position:absolute;inset:0;pointer-events:none;
934
+ background:linear-gradient(130deg,rgba(184,240,255,.1),transparent 42%);
935
+ }
936
+ .hero-product:hover .hero-shot{transform:perspective(2000px) rotateY(-1deg) rotateX(.5deg)}
937
+ .hero-product figcaption{
938
+ position:relative;z-index:1;margin-top:14px;font-family:var(--mono);font-size:var(--fs-micro);
939
+ letter-spacing:.2em;text-transform:uppercase;color:var(--mute);text-align:right;
940
+ }
941
+ @media (max-width:960px){
942
+ .hero-split{grid-template-columns:minmax(0,1fr);gap:36px}
943
+ .hero-shot{transform:none;width:100%}
944
+ .hero-product .hero-art{inset:-10% -6%;opacity:.34}
945
+ .hero-product figcaption{text-align:left}
946
+ }
947
+ @media (prefers-reduced-motion:reduce){.hero-shot{transform:none;transition:none}}
948
+
949
+ /* Route proof: the ranking claim, recorded. */
950
+ .risk-proof,
951
+ .route-proof{position:relative;margin:0 auto var(--space-5);max-width:868px;border:1px solid rgba(124,196,255,.16);border-radius:var(--r-md);overflow:hidden;background:#080d15;line-height:0}
952
+ .risk-proof video,
953
+ .route-proof video{display:block;width:100%;max-width:868px;height:auto;opacity:0;transition:opacity .5s var(--ease)}
954
+ .risk-proof video.ready,
955
+ .route-proof video.ready{opacity:1}
956
+ .risk-proof #risk-still,
957
+ .route-proof #route-still{display:block;width:100%;max-width:868px;height:auto}
958
+ .risk-proof video.ready ~ #risk-still,
959
+ .route-proof video.ready ~ #route-still{position:absolute;inset:0;opacity:0;pointer-events:none}
960
+ .risk-proof figcaption,
961
+ .route-proof figcaption{line-height:1.4;padding:10px 14px;border-top:1px solid rgba(124,196,255,.12);font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;color:var(--blue2)}
962
+ @media (prefers-reduced-motion:reduce){
963
+ .risk-proof video,
964
+ .route-proof video{display:none}
965
+ .risk-proof #risk-still,
966
+ .route-proof #route-still{position:static;opacity:1}
967
+ }
968
+
969
+ /* The orb is the hero mark, so it drops the terminal panel chrome entirely:
970
+ no border, no dark fill, no 3D tilt, no edge bleed. */
971
+ .hero-shot-orb{
972
+ border:0;background:transparent;box-shadow:none;transform:none;overflow:visible;
973
+ width:min(100%,560px);margin-inline:auto;border-radius:0;
974
+ }
975
+ .hero-shot-orb::after{display:none}
976
+ .hero-product:hover .hero-shot-orb{transform:none}
977
+ .hero-shot-orb video,
978
+ .hero-shot-orb #orb-still{
979
+ display:block;width:100%;height:auto;
980
+ /* The render's background is rgb(10,16,23) at full alpha -- near-black, but not
981
+ black. Screen/additive blending can only cancel true #000, which is why the
982
+ plate stayed visible. Crush the floor to real black first, then screen it
983
+ away. Highlights sit at 244+ so they survive the crush untouched. */
984
+ filter:brightness(1.16) contrast(1.3);
985
+ mix-blend-mode:screen;
986
+ /* Belt and braces: feather the boundary so no engine can show a hard edge. */
987
+ -webkit-mask-image:radial-gradient(ellipse 64% 64% at 50% 47%, #000 42%, transparent 74%);
988
+ mask-image:radial-gradient(ellipse 64% 64% at 50% 47%, #000 42%, transparent 74%);
989
+ }
990
+ .hero-shot-orb video{opacity:0;transition:opacity .6s var(--ease)}
991
+ .hero-shot-orb video.ready{opacity:1}
992
+ .hero-shot-orb video.ready ~ #orb-still{position:absolute;inset:0;opacity:0;pointer-events:none}
993
+ @media (prefers-reduced-motion:reduce){
994
+ .hero-shot-orb video{display:none}
995
+ .hero-shot-orb #orb-still{position:static;opacity:1}
996
+ }
997
+ /* CLI section leads with the filled active-surface still. */
998
+ .cli-proof{position:relative;aspect-ratio:auto;height:auto;min-height:0;padding:0;
999
+ max-width:868px;margin-inline:auto;line-height:0;display:block}
1000
+ .cli-proof #cli-still{display:block;width:100%;height:auto}
1001
+ .cli-proof video.ready ~ #cli-still{position:absolute;inset:0;opacity:0;pointer-events:none}
1002
+ @media (prefers-reduced-motion:reduce){
1003
+ .cli-proof video{display:none}
1004
+ .cli-proof #cli-still{position:static;opacity:1}
1005
+ }
1006
+
1007
+ /* Recorded session leads; the still is the fallback underneath it. */
1008
+ .hero-shot{position:relative}
1009
+ .hero-shot video{display:block;width:100%;height:auto;opacity:0;transition:opacity .6s var(--ease)}
1010
+ .hero-shot video.ready{opacity:1}
1011
+ .hero-shot video.ready + #cli-still{opacity:0}
1012
+ #cli-still{display:block;width:100%;height:auto;transition:opacity .6s var(--ease)}
1013
+ .hero-shot video.ready ~ #cli-still{position:absolute;inset:0;pointer-events:none}
1014
+ @media (prefers-reduced-motion:reduce){
1015
+ .hero-shot video{display:none}
1016
+ #cli-still{position:static;opacity:1}
1017
+ }
1018
+
1019
+ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);padding:32px var(--pad) 40px;position:relative;z-index:2}
1020
+ .labs-link{font-family:"UnifrakturCook","Old English Text MT","Lucida Blackletter",serif;font-size:var(--fs-base);letter-spacing:.04em;text-transform:none;color:var(--blue2)}
1021
+ .labs-link:hover{color:var(--ink)}
1022
+ .foot-row{
1023
+ max-width:var(--max);margin:0 auto 14px;
1024
+ display:flex;flex-wrap:wrap;gap:14px 24px;justify-content:space-between;align-items:center;
1025
+ }
1026
+ .powered{
1027
+ display:inline-flex;align-items:center;gap:10px;
1028
+ font-family:var(--mono);font-size:var(--fs-xs);letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
1029
+ }
1030
+ .powered .mark{width:7px;height:7px;border-radius:50%;background:var(--blue);box-shadow:0 0 12px rgba(124,196,255,.7)}
1031
+ .powered a{color:var(--blue);font-weight:600;border-bottom:1px solid transparent;transition:border-color .25s,color .25s}
1032
+ .powered a:hover{border-bottom-color:var(--blue);color:var(--ink)}
1033
+ .foot-links{display:flex;gap:18px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
1034
+ .foot-links a:hover{color:var(--blue)}
1035
+ .foot-meta{
1036
+ max-width:var(--max);margin:0 auto;
1037
+ display:flex;flex-wrap:wrap;gap:12px 22px;justify-content:space-between;
1038
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
1039
+ }
1040
+
1041
+ .js .rv{opacity:0;transform:translate3d(0,22px,0);will-change:opacity,transform}
1042
+ .js .rv.in{opacity:1;transform:translate3d(0,0,0);transition:opacity 1.05s var(--ease),transform 1.05s var(--ease)}
1043
+ .js .rv.done{transform:none;will-change:auto}
1044
+
1045
+ @media (max-width:960px){
1046
+ .home-inner{max-width:760px}
1047
+ .hero-stage{min-height:clamp(300px,44vh,460px)}.home-title{font-size:var(--fs-4xl)}
1048
+ .nav-chip{display:none}
1049
+ .nav-links .hide-sm{display:none}
1050
+ .route-strip{grid-template-columns:1fr}
1051
+ .chain-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
1052
+ .row.profiles{grid-template-columns:repeat(2,minmax(0,1fr))}
1053
+ }
1054
+ @media (max-width:720px){
1055
+ :root{--pad:clamp(16px,5vw,24px)}
1056
+ .cli-frame,.cli-frame img,.convert-copy,.convert-grid{max-width:100%;width:100%}
1057
+ .cli-frame img{height:auto}
1058
+ main{padding-top:68px}
1059
+ .nav{padding:12px var(--pad)}
1060
+ .brand{font-size:var(--fs-lg)}
1061
+ .brand .orbital{width:24px;height:24px}
1062
+ .home{min-height:auto;padding-top:22px;padding-bottom:58px}
1063
+ .home::after{bottom:8px;height:48px}
1064
+ .hero-stage{min-height:240px}
1065
+ .hero-orb{width:min(78vw,300px)}
1066
+ .hero-orb .orbit-dot{animation-name:orbit-travel-mobile}
1067
+ @keyframes orbit-travel-mobile{from{transform:rotateX(76deg) rotateZ(0deg) translateX(min(30vw,128px))}to{transform:rotateX(76deg) rotateZ(360deg) translateX(min(30vw,128px))}}
1068
+ .home-title{font-size:var(--fs-4xl);letter-spacing:-.05em}
1069
+ .home-kicker{font-size:var(--fs-micro);letter-spacing:.22em}
1070
+ .home-copy p:not(.home-kicker){max-width:34ch;font-size:var(--fs-base);line-height:1.58;margin-top:14px}
1071
+ .home-actions{width:100%;margin-top:22px}
1072
+ .enter-cta{width:100%;max-width:280px;min-height:48px;justify-content:center;padding:13px 18px}
1073
+ .section{padding:clamp(44px,8vh,72px) var(--pad) 0}
1074
+ .section-label{letter-spacing:.22em}
1075
+ .section-title{font-size:var(--fs-xl);max-width:12ch}
1076
+ .section-lede{font-size:var(--fs-base);line-height:1.6;margin-bottom:24px}
1077
+ .graph-top{justify-content:flex-start;padding:12px;font-size:var(--fs-micro);line-height:1.55;letter-spacing:.12em}
1078
+ .evolve-rail{justify-content:flex-start;flex-wrap:nowrap;overflow-x:auto;padding:12px;-webkit-overflow-scrolling:touch}
1079
+ .evolve-pill{white-space:nowrap;flex:0 0 auto}
1080
+ .graph-canvas{overflow:visible;padding:22px 12px 24px}
1081
+ .orch{width:100%;min-width:0}
1082
+ .row{gap:10px}
1083
+ .row>.node[style]{width:100%!important;max-width:260px}
1084
+ .node.hub{width:100%;max-width:260px}
1085
+ .row.profiles{grid-template-columns:1fr}
1086
+ .node.route,.node.add,.node.builder-sink{min-height:auto}
1087
+ .node.route .chains{line-height:1.55}
1088
+ .wires{height:34px;overflow:hidden}
1089
+ .wires.funnel{height:42px}
1090
+ .builder-row{margin-top:4px}
1091
+ .route-card{min-height:auto;padding:20px 16px;background:rgba(17,25,37,.94)}
1092
+ .route-card h3{font-size:var(--fs-lg);line-height:1.05;flex-wrap:wrap}
1093
+ .why-band{padding:20px 16px 22px}
1094
+ .hl-surface{padding:16px}
1095
+ .chain .id{white-space:normal;text-align:right}
1096
+ .venues-head{font-size:var(--fs-micro);letter-spacing:.12em;line-height:1.5}
1097
+ .marquee{overflow-x:auto;overflow-y:hidden;mask-image:none;-webkit-mask-image:none;scrollbar-width:none;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch}
1098
+ .marquee::-webkit-scrollbar{display:none}
1099
+ .marquee .track,.marquee.rev .track{min-width:max-content;animation:none;transform:none;will-change:auto}
1100
+ .track{gap:16px}
1101
+ .chip{font-size:var(--fs-sm);padding:8px 11px}
1102
+ .chip.wm-chip{padding:10px 14px}
1103
+ .chip img.wm{height:24px;max-width:132px}
1104
+ .chip img.wm.tall{width:26px;height:26px;min-width:26px;max-width:26px}
1105
+ footer{padding:28px var(--pad) 34px}
1106
+ .foot-row,.foot-meta{justify-content:center;text-align:center}
1107
+ .foot-links{flex-wrap:wrap;justify-content:center;gap:12px 16px}
1108
+ }
1109
+ @media (max-width:560px){
1110
+ .chain-grid{grid-template-columns:1fr}
1111
+ }
1112
+ @media (max-width:380px){
1113
+ .home-title{font-size:var(--fs-3xl)}
1114
+ .hero-stage{min-height:220px}
1115
+ .section-title{font-size:var(--fs-xl)}
1116
+ }
1117
+ @media (prefers-reduced-motion:reduce){
1118
+ html{scroll-behavior:auto}
1119
+ .js .rv{opacity:1;transform:none;filter:none}
1120
+ .track,.orbital .ring,.orbital .tickring,.orbital .core,.hero-orb,.hero-art::before,.home::after{animation:none}
1121
+ .wires path{stroke-dasharray:none;stroke-dashoffset:0}
1122
+ .wires circle{opacity:1}
1123
+ .node:hover,.chain:hover{transform:none}
1124
+ }
1125
+ </style>
1126
+ </head>
1127
+ <body>
1128
+ <div class="grain" aria-hidden="true"></div>
1129
+ <div class="progress" id="progress" aria-hidden="true"></div>
1130
+
1131
+ <div class="loader" id="loader" aria-hidden="true">
1132
+ <div class="loader-inner">
1133
+ <div class="loader-mark orbital" aria-hidden="true">
1134
+ <svg viewBox="0 0 100 100">
1135
+ <g class="ring r1"><ellipse cx="50" cy="50" rx="44" ry="15"/></g>
1136
+ <g class="ring r2"><ellipse cx="50" cy="50" rx="44" ry="15" transform="rotate(62 50 50)"/></g>
1137
+ <g class="ring r3"><ellipse cx="50" cy="50" rx="44" ry="15" transform="rotate(124 50 50)"/></g>
1138
+ <circle class="tickring" cx="50" cy="50" r="30"/>
1139
+ <circle class="halo" cx="50" cy="50" r="9"/>
1140
+ <circle class="core" cx="50" cy="50" r="6.5"/>
1141
+ </svg>
1142
+ </div>
1143
+ </div>
1144
+ </div>
1145
+
1146
+ <header class="nav">
1147
+ <a class="brand" href="#top">
1148
+ <span class="orbital" aria-hidden="true">
1149
+ <svg viewBox="0 0 100 100">
1150
+ <g class="ring r1"><ellipse cx="50" cy="50" rx="45" ry="17"/></g>
1151
+ <g class="ring r2"><ellipse cx="50" cy="50" rx="45" ry="17" transform="rotate(64 50 50)"/></g>
1152
+ <circle class="halo" cx="50" cy="50" r="13"/>
1153
+ <circle class="core" cx="50" cy="50" r="11"/>
1154
+ </svg>
1155
+ </span>
1156
+ oracle</a>
1157
+ <nav class="nav-links" aria-label="Primary">
1158
+ <a class="hide-sm" href="#cli">CLI</a>
1159
+ <a class="hide-sm" href="#orchestration">Profiles</a>
1160
+ <a class="hide-sm" href="#strategies">Strategies</a>
1161
+ </nav>
1162
+ </header>
1163
+
1164
+ <main id="top">
1165
+ <canvas id="gl" aria-hidden="true"></canvas>
1166
+ <div class="veil" aria-hidden="true"></div>
1167
+
1168
+ <section class="home" id="home">
1169
+ <div class="home-inner">
1170
+ <div class="hero-split">
1171
+ <div class="hero-lede">
1172
+ <p class="home-kicker rv">self-custody agent control</p>
1173
+ <h1 class="home-title rv">Trade every chain<br>from <em>one</em> agent</h1>
1174
+ <p class="hero-sub rv">Hyperliquid, EVM, Bitcoin, Solana, Stable and Robinhood Chain in a single control plane. Oracle reads state, prices routes and prepares the transaction. Your wallet signs it.</p>
1175
+ <div class="home-actions">
1176
+ <a class="enter-cta primary" href="#cli">Download</a>
1177
+ <a class="enter-cta ghost" href="#cli">See the CLI</a>
1178
+ </div>
1179
+ <p class="hero-note-line">macOS · Windows · Linux &nbsp;/&nbsp; desktop app or holder-gated CLI</p>
1180
+ </div>
1181
+
1182
+ <figure class="hero-product">
1183
+ <div class="hero-art" aria-hidden="true">
1184
+ <div class="hero-orb" id="hero-orb">
1185
+ <span class="lat l1"></span><span class="lat l2"></span><span class="lat l3"></span><span class="lat l4"></span>
1186
+ <span class="par p1"></span><span class="par p2"></span><span class="par p3"></span>
1187
+ <span class="eq"></span>
1188
+ <span class="core-glow"></span>
1189
+ <span class="orbit-dot"></span>
1190
+ </div>
1191
+ </div>
1192
+ <div class="hero-shot hero-shot-orb" id="hero-title">
1193
+ <video id="orb-video" width="900" height="900"
1194
+ poster="assets/hero/orb-poster.jpg?v=2026080623"
1195
+ muted loop playsinline autoplay preload="metadata"
1196
+ aria-label="Oracle mark">
1197
+ <source src="assets/hero/orb.webm?v=2026080623" type="video/webm">
1198
+ </video>
1199
+ <img id="orb-still" src="assets/hero/orb-poster.jpg?v=2026080623" alt="Oracle mark" width="900" height="900" loading="eager" fetchpriority="high" decoding="async">
1200
+ </div>
1201
+ <figcaption>the future is agentic</figcaption>
1202
+ </figure>
1203
+ </div>
1204
+
1205
+ <div class="home-stats rv" aria-label="Oracle surface metrics">
1206
+ <div class="home-stat"><b id="hero-protocol-count" data-count="110">110</b><span>protocol entries wired</span></div>
1207
+ <div class="home-stat"><b id="hero-provider-count" data-count="70">70</b><span>data providers</span></div>
1208
+ <div class="home-stat"><b id="hero-op-count" data-count="322">322</b><span>data operations</span></div>
1209
+ <div class="home-stat"><b id="hero-chain-count">13 + EVM</b><span>chains wired</span></div>
1210
+ </div>
1211
+ </div>
1212
+ </section>
1213
+ <section class="section" id="orchestration">
1214
+ <p class="section-label rv">Profiles</p>
1215
+ <h2 class="section-title rv">Multi-profile. <em>Customizable.</em></h2>
1216
+ <p class="section-lede rv">Input / Command hits the Oracle control plane, then routes across venue profiles, multi-chain EVM, Bitcoin, Solana, and the protocol builder. Any MCP harness can drive a single agent.</p>
1217
+
1218
+ <div class="graph-shell rv">
1219
+ <div class="graph-top">
1220
+ <span>multi-profile // protocol builder // multi-chain</span>
1221
+ </div>
1222
+
1223
+ <div class="evolve-rail">
1224
+ <span class="evolve-pill on">customizable</span>
1225
+ <span class="evolve-pill on">protocol builder</span>
1226
+ <span class="evolve-pill on">more chains</span>
1227
+ </div>
1228
+
1229
+ <div class="graph-canvas">
1230
+ <div class="orch" aria-label="Oracle multi-profile graph">
1231
+ <div class="row">
1232
+ <div class="node" style="width:220px">
1233
+ <div class="tag">you</div>
1234
+ <div class="name">Input / Command</div>
1235
+ <div class="sub">what you type or ask</div>
1236
+ </div>
1237
+ </div>
1238
+
1239
+ <div class="wires" aria-hidden="true">
1240
+ <svg viewBox="0 0 100 36" preserveAspectRatio="none">
1241
+ <path d="M50 2 V34" pathLength="1"/><circle cx="50" cy="2" r="1.4"/><circle cx="50" cy="34" r="1.4"/>
1242
+ </svg>
1243
+ </div>
1244
+
1245
+ <div class="row">
1246
+ <div class="node hub">
1247
+ <div class="tag">control plane</div>
1248
+ <div class="orbital" aria-hidden="true">
1249
+ <svg viewBox="0 0 100 100">
1250
+ <g class="ring r1"><ellipse cx="50" cy="50" rx="46" ry="16"/></g>
1251
+ <g class="ring r2"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(60 50 50)"/></g>
1252
+ <g class="ring r3"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(120 50 50)"/></g>
1253
+ <circle class="tickring" cx="50" cy="50" r="32"/>
1254
+ <circle class="halo" cx="50" cy="50" r="10"/>
1255
+ <circle class="core" cx="50" cy="50" r="7.5"/>
1256
+ </svg>
1257
+ </div>
1258
+ <div class="name">oracle</div>
1259
+ <div class="sub">route · bound · evolve</div>
1260
+ </div>
1261
+ </div>
1262
+
1263
+ <div class="wires multi" aria-hidden="true">
1264
+ <svg viewBox="0 0 100 44" preserveAspectRatio="none">
1265
+ <path d="M50 2 V12" pathLength="1"/>
1266
+ <path class="w-poly w-2" d="M12.5 42 V20 H50 V12" pathLength="1"/>
1267
+ <path class="w-hl w-3" d="M37.5 42 V20 H50 V12" pathLength="1"/>
1268
+ <path class="w-rh w-4" d="M62.5 42 V20 H50 V12" pathLength="1"/>
1269
+ <path class="w-sol w-5" d="M87.5 42 V20 H50 V12" pathLength="1"/>
1270
+ <circle cx="50" cy="2" r="1.3"/>
1271
+ <circle class="c-poly" cx="12.5" cy="42" r="1.3"/>
1272
+ <circle class="c-hl" cx="37.5" cy="42" r="1.3"/>
1273
+ <circle class="c-rh" cx="62.5" cy="42" r="1.3"/>
1274
+ <circle class="c-sol" cx="87.5" cy="42" r="1.3"/>
1275
+ </svg>
1276
+ </div>
1277
+
1278
+ <div class="row profiles" id="profile-grid">
1279
+ <div class="node route p-poly">
1280
+ <div class="tag">profile</div>
1281
+ <div class="name">polymarket agent</div>
1282
+ <div class="sub">events · arb · markets</div>
1283
+ <div class="chains"><span class="ch">Polymarket <img src="https://icons.llamao.fi/icons/protocols/polymarket?w=24&h=24" alt="" loading="lazy"></span></div>
1284
+ </div>
1285
+ <div class="node route p-hl">
1286
+ <div class="tag">profile</div>
1287
+ <div class="name">hyperliquid agent</div>
1288
+ <div class="sub">perps · hip-3/4 · ta</div>
1289
+ <div class="chains"><span class="ch">Hyperliquid <img src="https://icons.llamao.fi/icons/protocols/hyperliquid?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Hyperliquid 999 <img src="https://icons.llamao.fi/icons/chains/rsz_hyperliquid?w=24&h=24" alt="" loading="lazy"></span></div>
1290
+ </div>
1291
+ <div class="node route p-rh">
1292
+ <div class="tag">profile</div>
1293
+ <div class="name">robinhood agent</div>
1294
+ <div class="sub">markets · memecoins · nfts</div>
1295
+ <div class="chains"><span class="ch">Robinhood Chain <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=24&h=24" alt="" loading="lazy"></span></div>
1296
+ </div>
1297
+ <div class="node route p-sol">
1298
+ <div class="tag">profile</div>
1299
+ <div class="name">solana agent</div>
1300
+ <div class="sub">jup · lst · lending · mev</div>
1301
+ <div class="chains"><span class="ch">Solana <img src="https://icons.llamao.fi/icons/chains/rsz_solana?w=24&h=24" alt="" loading="lazy"></span></div>
1302
+ </div>
1303
+ <div class="node route p-btc">
1304
+ <div class="tag">profile</div>
1305
+ <div class="name">bitcoin agent</div>
1306
+ <div class="sub">ord · runes · staking · lightning</div>
1307
+ <div class="chains"><span class="ch">Bitcoin <img src="https://icons.llamao.fi/icons/chains/rsz_bitcoin?w=24&h=24" alt="" loading="lazy"></span><span class="ch">inscriptions</span></div>
1308
+ </div>
1309
+ <div class="node route p-stable">
1310
+ <div class="tag">profile</div>
1311
+ <div class="name">stable agent</div>
1312
+ <div class="sub">launches · memecoins</div>
1313
+ <div class="chains"><span class="ch">Stable <img src="https://icons.llamao.fi/icons/chains/rsz_stable?w=24&h=24" alt="" loading="lazy"></span></div>
1314
+ </div>
1315
+ <div class="node route p-base">
1316
+ <div class="tag">profile</div>
1317
+ <div class="name">base agent</div>
1318
+ <div class="sub">swaps · defi · onchain apps</div>
1319
+ <div class="chains"><span class="ch">Base <img src="https://icons.llamao.fi/icons/chains/rsz_base?w=24&h=24" alt="" loading="lazy"></span></div>
1320
+ </div>
1321
+ <div class="node route p-evm">
1322
+ <div class="tag">profile</div>
1323
+ <div class="name">evm / bridge agent</div>
1324
+ <div class="sub">swaps · bridges · lending · restaking</div>
1325
+ <div class="chains"><span class="ch">ETH <img src="https://icons.llamao.fi/icons/chains/rsz_ethereum?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Arb <img src="https://icons.llamao.fi/icons/chains/rsz_arbitrum?w=24&h=24" alt="" loading="lazy"></span><span class="ch">OP <img src="https://icons.llamao.fi/icons/chains/rsz_optimism?w=24&h=24" alt="" loading="lazy"></span><span class="ch">BNB <img src="https://icons.llamao.fi/icons/chains/rsz_binance?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Avax <img src="https://icons.llamao.fi/icons/chains/rsz_avalanche?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Polygon <img src="https://icons.llamao.fi/icons/chains/rsz_polygon?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Abstract <img src="https://icons.llamao.fi/icons/chains/rsz_abstract?w=24&h=24" alt="" loading="lazy"></span><span class="ch ch-add" title="Any EVM chain: register a chainId and RPC, no code change">+ any EVM chain</span></div>
1326
+ </div>
1327
+ </div>
1328
+
1329
+ <div class="wires funnel" aria-hidden="true">
1330
+ <svg viewBox="0 0 100 62" preserveAspectRatio="none">
1331
+ <path class="w-1" d="M6 2 C6 30 50 22 50 60" pathLength="1"/>
1332
+ <path class="w-2" d="M19 2 C19 28 50 26 50 60" pathLength="1"/>
1333
+ <path class="w-3" d="M32 2 C32 34 50 34 50 60" pathLength="1"/>
1334
+ <path class="w-4" d="M45 2 C45 38 50 42 50 60" pathLength="1"/>
1335
+ <path class="w-5" d="M55 2 C55 38 50 42 50 60" pathLength="1"/>
1336
+ <path class="w-3" d="M68 2 C68 34 50 34 50 60" pathLength="1"/>
1337
+ <path class="w-2" d="M81 2 C81 28 50 26 50 60" pathLength="1"/>
1338
+ <path class="w-1" d="M94 2 C94 30 50 22 50 60" pathLength="1"/>
1339
+ <circle cx="50" cy="60" r="1.8"/>
1340
+ </svg>
1341
+ </div>
1342
+
1343
+ <div class="row builder-row">
1344
+ <div class="node route p-build builder-sink">
1345
+ <div class="tag">bottom layer</div>
1346
+ <div class="name">protocol builder</div>
1347
+ <div class="sub">every profile can funnel into new contracts, scripts, checks, deploy prep, and chain-specific scaffolds.</div>
1348
+ <div class="chains"><span class="ch">any EVM · pinned factories · user-signed deploys</span></div>
1349
+ </div>
1350
+ </div>
1351
+ </div>
1352
+ </div>
1353
+
1354
+
1355
+
1356
+ <div class="route-strip">
1357
+ <article class="route-card p-poly">
1358
+ <div class="where">polymarket agent →</div>
1359
+ <h3>Polymarket <img src="https://icons.llamao.fi/icons/protocols/polymarket?w=40&h=40" alt="Polymarket" loading="lazy"></h3>
1360
+ <p>Event markets, sports, arb paths, and prediction flow under bounds you set. CLOB prepare shipped in the public plane.</p>
1361
+ <div class="chips">
1362
+ <span class="chip-s">events</span>
1363
+ <span class="chip-s">arb</span>
1364
+ <span class="chip-s">clob prepare</span>
1365
+ </div>
1366
+ </article>
1367
+ <article class="route-card p-hl">
1368
+ <div class="where">hyperliquid agent →</div>
1369
+ <h3>Hyperliquid <img src="https://icons.llamao.fi/icons/protocols/hyperliquid?w=40&h=40" alt="Hyperliquid" loading="lazy"></h3>
1370
+ <p>Native perps, HIP-3/4 asset resolve, TA, event risk, and Hyperliquid when you need HL's EVM surface.</p>
1371
+ <div class="chips">
1372
+ <span class="chip-s">perps</span>
1373
+ <span class="chip-s">HIP-3/4</span>
1374
+ <span class="chip-s">Hyperliquid</span>
1375
+ </div>
1376
+ </article>
1377
+ <article class="route-card p-rh">
1378
+ <div class="where">robinhood agent →</div>
1379
+ <h3>Robinhood <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=40&h=40" alt="Robinhood Chain" loading="lazy"></h3>
1380
+ <p>RH Chain markets, memecoins, NFTs, names, token scans, and chain-local routing.</p>
1381
+ <div class="chips">
1382
+ <span class="chip-s">markets</span>
1383
+ <span class="chip-s">memecoins</span>
1384
+ <span class="chip-s">NFTs</span>
1385
+ <span class="chip-s">rh chain</span>
1386
+ </div>
1387
+ </article>
1388
+ <article class="route-card p-sol">
1389
+ <div class="where">solana agent →</div>
1390
+ <h3>Solana <img src="https://icons.llamao.fi/icons/chains/rsz_solana?w=40&h=40" alt="Solana" loading="lazy"></h3>
1391
+ <p>Jupiter routes, Sanctum liquid-staking tokens, Solend lending, Kamino strategies, Meteora DLMM, Jito MEV, and Pyth feeds. The bounded lane decodes every instruction and bans delegation ops outright.</p>
1392
+ <div class="chips">
1393
+ <span class="chip-s">Jupiter</span>
1394
+ <span class="chip-s">swaps</span>
1395
+ <span class="chip-s">decoded ix</span>
1396
+ </div>
1397
+ </article>
1398
+ <article class="route-card p-btc">
1399
+ <div class="where">bitcoin agent →</div>
1400
+ <h3>Bitcoin <img src="https://icons.llamao.fi/icons/chains/rsz_bitcoin?w=40&h=40" alt="Bitcoin" loading="lazy"></h3>
1401
+ <p>Ordinals, runes, Babylon staking, Lightning topology, mining economics, and the Liquid and Stacks sidechains. Every PSBT input carries proven provenance, so fees are computed, not asserted.</p>
1402
+ <div class="chips">
1403
+ <span class="chip-s">ordinals</span>
1404
+ <span class="chip-s">runes</span>
1405
+ <span class="chip-s">psbt proof</span>
1406
+ </div>
1407
+ </article>
1408
+ <article class="route-card p-evm">
1409
+ <div class="where">evm / bridge agent →</div>
1410
+ <h3>Multi-chain EVM <img src="https://icons.llamao.fi/icons/chains/rsz_ethereum?w=40&h=40" alt="Ethereum" loading="lazy"></h3>
1411
+ <p>Multi-chain routes, LI.FI and Relay bridges, Aave lending, Spark, Beefy, Symbiotic restaking, and CoW solver auctions. Bounded evm-swap and evm-bridge lanes.</p>
1412
+ <div class="chips">
1413
+ <span class="chip-s">evm-swap</span>
1414
+ <span class="chip-s">evm-bridge</span>
1415
+ <span class="chip-s">best route</span>
1416
+ </div>
1417
+ </article>
1418
+ <article class="route-card p-nft">
1419
+ <div class="where">nft agent →</div>
1420
+ <h3>Cross-chain NFTs <img src="assets/protocols/opensea.png" alt="OpenSea" loading="lazy"></h3>
1421
+ <p>List across 22 EVM chains and Solana via OpenSea. Buy and list Ordinals through Satflow with proven PSBT provenance. Solana listings via Magic Eden. Floors, holdings and PnL are read first, then prepared for your signature.</p>
1422
+ <div class="chips">
1423
+ <span class="chip-s">list</span>
1424
+ <span class="chip-s">buy</span>
1425
+ <span class="chip-s">floor · pnl</span>
1426
+ </div>
1427
+ </article>
1428
+ <article class="route-card p-stable">
1429
+ <div class="where">stable agent →</div>
1430
+ <h3>Stable <img src="https://icons.llamao.fi/icons/chains/rsz_stable?w=40&h=40" alt="Stable" loading="lazy"></h3>
1431
+ <p>Stable mainnet launch radar, memecoins, USDT0 gas, and venue ops, scanned straight from the chain's own logs.</p>
1432
+ <div class="chips">
1433
+ <span class="chip-s">launches</span>
1434
+ <span class="chip-s">memecoins</span>
1435
+ <span class="chip-s">USDT0 gas</span>
1436
+ <span class="chip-s">Stable</span>
1437
+ </div>
1438
+ </article>
1439
+ <article class="route-card p-build">
1440
+ <div class="where">protocol builder →</div>
1441
+ <h3>Build protocols</h3>
1442
+ <p>Scaffold contracts, run security gates (Foundry + static checks), prepare unsigned deploys through pinned factories. You still sign every deploy.</p>
1443
+ <div class="chips">
1444
+ <span class="chip-s">scaffold</span>
1445
+ <span class="chip-s">security gate</span>
1446
+ <span class="chip-s">unsigned deploy</span>
1447
+ </div>
1448
+ </article>
1449
+ </div>
1450
+ <div class="why-band">
1451
+ <p>The model proposes. Policy bounds. You own signatures. Multi-profile desks route each request to the right surface. Vaults, perps, bridges, and protocol scaffolds, not just swaps. Empty allowlists refuse everything until you configure them.</p>
1452
+ </div>
1453
+ </div>
1454
+
1455
+ <div class="band-head rv">
1456
+ <p class="eyebrow">Custody</p>
1457
+ <h2>The wallet stays yours.</h2>
1458
+ </div>
1459
+ <div class="moat-grid rv" style="margin-top:28px">
1460
+ <article class="moat-card">
1461
+ <div class="n">bound grants</div>
1462
+ <h3>Wallet with temporary agent permission</h3>
1463
+ <p>Max value, chain, venue, destinations, and TTL. Outside the grant = hard refuse, not an agent with a free wallet.</p>
1464
+ </article>
1465
+ <article class="moat-card">
1466
+ <div class="n">bounded surfaces</div>
1467
+ <h3>Six lanes, each with its own decoder</h3>
1468
+ <p>hl, poly, evm-swap, evm-bridge, btc, sol. Each decodes its own envelope, proves every value-moving field, and refuses while its allowlists are empty.</p>
1469
+ </article>
1470
+ <article class="moat-card">
1471
+ <div class="n">evidence</div>
1472
+ <h3>Decoded before you sign, receipted after</h3>
1473
+ <p>minOut, impact, spender, and decoded calldata before approval; tx hash, receipt status, balance delta, and allowance state after. Unsigned artifacts export to hardware wallets. No “looks filled.”</p>
1474
+ </article>
1475
+ <article class="moat-card">
1476
+ <div class="n">fail closed</div>
1477
+ <h3>Unconfigured means refused</h3>
1478
+ <p>A fresh install signs nothing. Destination allowlists stop silent router drift, and every lane refuses while its allowlists are empty, so new contracts stay blocked until you add them.</p>
1479
+ </article>
1480
+ </div>
1481
+
1482
+ <div class="selfcustody rv">
1483
+ <p class="section-label rv">Works in any harness</p>
1484
+ <h2 class="section-title rv" data-split>Ask in <em>your</em> agent.</h2>
1485
+ <p class="section-lede rv">Oracle installs as an MCP server, so the agent you already use gets 110 protocol entries across 13 chains. Type the request the way you would say it. Oracle reads state, prices routes and prepares the transaction. You sign.</p>
1486
+ <div class="agent-install rv">
1487
+ <span>Add Oracle to your agent:</span>
1488
+ <div class="install-cmds">
1489
+ <button class="btn btn-claude" onclick="navigator.clipboard.writeText('oracle mcp install claude-code');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Claude'},1500)">Claude</button>
1490
+ <button class="btn btn-chatgpt" onclick="navigator.clipboard.writeText('oracle mcp install chatgpt');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='ChatGPT'},1500)">ChatGPT</button>
1491
+ <button class="btn btn-cursor" onclick="navigator.clipboard.writeText('oracle mcp install cursor');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Cursor'},1500)">Cursor</button>
1492
+ <button class="btn btn-vscode" onclick="navigator.clipboard.writeText('oracle mcp install vscode');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='VS Code'},1500)">VS Code</button>
1493
+ <button class="btn btn-copilot" onclick="navigator.clipboard.writeText('oracle mcp install copilot');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Copilot'},1500)">Copilot</button>
1494
+ </div>
1495
+ <p class="cmd-hint">Click copies the install command — paste it in your terminal</p>
1496
+ </div>
1497
+ <div class="agent-prompts rv">
1498
+ <figure class="agent-panel is-claude" data-agent-seq
1499
+ data-ask="is this token safe to buy on base?">
1500
+ <div class="agent-box">
1501
+ <div class="agent-line"><span class="agent-typed" data-ph="Do anything"></span><span class="agent-caret"></span></div>
1502
+ <div class="agent-bar">
1503
+ <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>
1504
+ <span class="ca-access"><svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M8.2 3h7.6L21 8.2v7.6L15.8 21H8.2L3 15.8V8.2z"/><path d="M12 8v5"/><path d="M12 16.2v.1"/></svg>Full access</span>
1505
+ <span class="agent-spacer"></span>
1506
+ <span class="ca-model"><b>5.6 Sol</b><span>Extra High</span><svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg></span>
1507
+ <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0M12 18v3"/></svg>
1508
+ <span class="ca-orb"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 10v4M9 6v12M13 8v8M17 10v4M21 11v2"/></svg></span>
1509
+ </div>
1510
+ </div>
1511
+ <p class="agent-out" hidden><b>PASS</b> metadata &middot; <b>PASS</b> liquidity &middot; <b>PASS</b> sellable &middot; unknown is not pass</p>
1512
+ <noscript><p class="agent-ask">is this token safe to buy on base?</p></noscript>
1513
+ </figure>
1514
+ <figure class="agent-panel is-codex" data-agent-seq
1515
+ data-ask="move 5k usdc into weth, cheapest route">
1516
+ <div class="cx-chips">
1517
+ <span class="cx-chip"><svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="5" width="18" height="12" rx="2"/><path d="M2 20h20"/></svg>Local</span>
1518
+ <span class="cx-chip"><svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg>clawd-local</span>
1519
+ <span class="cx-chip cx-sq"><svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><path d="M12 11v5M9.5 13.5h5"/></svg></span>
1520
+ </div>
1521
+ <div class="agent-box">
1522
+ <div class="agent-line"><span class="agent-typed" data-ph="Describe a task or ask a question"></span><span class="agent-caret"></span></div>
1523
+ <svg class="ai cx-return" viewBox="0 0 24 24" aria-hidden="true"><path d="M20 6v5a3 3 0 0 1-3 3H5"/><path d="M8 11l-3 3 3 3"/></svg>
1524
+ </div>
1525
+ <div class="agent-bar">
1526
+ <span class="cx-auto">Auto</span>
1527
+ <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>
1528
+ <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0M12 18v3"/></svg>
1529
+ <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
1530
+ <span class="agent-spacer"></span>
1531
+ <span class="cx-model">Fable 5</span>
1532
+ <span class="cx-eff">High</span>
1533
+ <span class="cx-ring"></span>
1534
+ </div>
1535
+ <p class="agent-out" hidden>best route across 5 aggregators &middot; quoted live &middot; <b>unsigned</b> &mdash; your wallet signs</p>
1536
+ <noscript><p class="agent-ask">move 5k usdc into weth, cheapest route</p></noscript>
1537
+ </figure>
1538
+ </div>
1539
+ <p class="agent-caption rv">Same tool from the terminal, the desktop app, or any MCP client. Prepare-only everywhere: Oracle never holds your keys.</p>
1540
+ <div class="venues rv">
1541
+ <div class="venues-head"><span>models // harnesses</span><span><b>bring your own model</b> · oracle is the control plane</span></div>
1542
+ <div class="marquee"><div class="track" id="llm-track"></div></div>
1543
+ </div>
1544
+
1545
+ <p class="section-label rv">Self-custodial agents</p>
1546
+ <h2 class="section-title rv">No third party holds your keys. Not even Oracle.</h2>
1547
+ <div class="selfcustody-grid">
1548
+ <div>
1549
+ <h4>Everything runs on your machine</h4>
1550
+ <p>The CLI and the desktop app are the whole product. There is no Oracle account, no hosted wallet, and no server that brokers your trades. Reads go straight from your machine to public RPCs and venue APIs.</p>
1551
+ </div>
1552
+ <div>
1553
+ <h4>Your keys never reach Oracle</h4>
1554
+ <p>The shipped package contains no signer, no vault, and no key material. Whatever key you use stays where you already keep it, in your wallet extension or on your hardware device, under that tool&rsquo;s own protection. A boundary test walks the real import graph on every build and fails if a public module so much as reaches toward signer code.</p>
1555
+ </div>
1556
+ <div>
1557
+ <h4>Your wallet signs, not Oracle</h4>
1558
+ <p>Oracle prepares an unsigned transaction and hands it to your browser extension or hardware wallet. It cannot broadcast. If you close the prompt, nothing happened.</p>
1559
+ </div>
1560
+ <div>
1561
+ <h4>Nothing to seize, nothing to leak</h4>
1562
+ <p>No custody means no honeypot. There is no server holding user keys to breach, no operator who can freeze you, and no counterparty risk from Oracle itself. Delete the app and your funds never moved.</p>
1563
+ </div>
1564
+ </div>
1565
+ </div>
1566
+
1567
+
1568
+ <div class="motion-lab rv" aria-label="Oracle high-end operator stack">
1569
+ <aside class="atlas-sticky motion-command" aria-label="Oracle runtime metrics">
1570
+ <div class="atlas-orbit" aria-hidden="true">
1571
+ <div class="orbital">
1572
+ <svg viewBox="0 0 100 100">
1573
+ <g class="ring r1"><ellipse cx="50" cy="50" rx="46" ry="16"/></g>
1574
+ <g class="ring r2"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(60 50 50)"/></g>
1575
+ <g class="ring r3"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(120 50 50)"/></g>
1576
+ <circle class="tickring" cx="50" cy="50" r="32"/>
1577
+ <circle class="halo" cx="50" cy="50" r="10"/>
1578
+ <circle class="core" cx="50" cy="50" r="7.5"/>
1579
+ </svg>
1580
+ </div>
1581
+ </div>
1582
+ <div class="atlas-copy">
1583
+ <div class="atlas-count"><span id="atlas-protocol-count">110</span></div>
1584
+ <p class="atlas-sub">Source-backed roster stays in the runtime. The landing page shows the control system, not a grocery list.</p>
1585
+ <div class="atlas-ledger">
1586
+ <div><span>quote / route</span><b id="atlas-route-count">0</b></div>
1587
+ <div><span>prepare / policy</span><b id="atlas-prepare-count">0</b></div>
1588
+ <div><span>chains</span><b id="atlas-chain-count">13 + EVM</b></div>
1589
+ <div><span>custody</span><b>self</b></div>
1590
+ </div>
1591
+ </div>
1592
+ </aside>
1593
+ <div class="motion-main">
1594
+ <div class="toolbelt" aria-label="What the operator stack does">
1595
+ <span>read state</span><span>price routes</span><span>prepare unsigned</span><span>enforce policy</span><span>you sign</span>
1596
+ </div>
1597
+ <div class="operator-grid" id="protocol-atlas-grid" aria-live="polite"></div>
1598
+ </div>
1599
+ </div>
1600
+ <div class="venues rv">
1601
+ <div class="venues-head"><span>protocols // venues</span></div>
1602
+ <div class="marquee"><div class="track" id="proto-track-a"></div></div>
1603
+ <div class="marquee rev"><div class="track" id="proto-track-b"></div></div>
1604
+ </div>
1605
+ </section>
1606
+
1607
+
1608
+ <div class="strategy-surface rv" id="strategies" aria-labelledby="strategies-title">
1609
+ <div class="strategy-head">
1610
+ <div>
1611
+ <div class="strategy-kicker">Agentic strategies</div>
1612
+ <h3 id="strategies-title">Move liquidity. Bound the risk.</h3>
1613
+ </div>
1614
+ <p>Oracle reads the position, models the route and costs, then prepares only the steps the selected lane can actually support.</p>
1615
+ </div>
1616
+ <figure class="route-proof rv">
1617
+ <video id="route-session" width="868" height="456"
1618
+ poster="assets/hero/route-session-poster.jpg"
1619
+ muted loop playsinline preload="none"
1620
+ aria-label="Recorded Oracle session pricing one swap across five venues and ranking them net of cost">
1621
+ <source src="assets/hero/route-session.webm" type="video/webm">
1622
+ <source src="assets/hero/route-session.mp4" type="video/mp4">
1623
+ </video>
1624
+ <img id="route-still" src="assets/hero/route-session-poster.jpg" alt="Oracle pricing a swap across paraswap, cow, uniswap-v3, lifi and uniswap-v4, ranked net of cost" width="868" height="456" loading="lazy" decoding="async">
1625
+ <figcaption>one swap, five venues, ranked net of cost</figcaption>
1626
+ </figure>
1627
+ <figure class="route-proof rv" style="margin-top:18px">
1628
+ <svg viewBox="0 0 868 456" preserveAspectRatio="xMidYMid meet" class="route-tree" aria-label="Oracle routing tree">
1629
+ <style>
1630
+ .route-tree line { stroke-dasharray: 20 8; animation: flow-down 3s linear infinite; opacity:1; }
1631
+ @keyframes flow-down { to { stroke-dashoffset: -56; } }
1632
+ </style>
1633
+ <defs>
1634
+ <marker id="arrow-t2" markerWidth="8" markerHeight="6" refX="0" refY="3" orient="auto"><path d="M0 0l8 3L0 6z" fill="var(--blue)" opacity=".8"/></marker>
1635
+ </defs>
1636
+ <rect x="334" y="30" width="200" height="40" rx="8" fill="rgba(124,196,255,.1)" stroke="var(--blue)" stroke-width="1.5"/>
1637
+ <text x="434" y="55" text-anchor="middle" fill="var(--warm)" font-family="var(--mono)" font-size="13">oracle route swap</text>
1638
+ <line x1="434" y1="70" x2="434" y2="110" stroke="var(--blue)" stroke-width="2" opacity=".8"/>
1639
+ <line x1="434" y1="110" x2="110" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
1640
+ <line x1="434" y1="110" x2="270" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
1641
+ <line x1="434" y1="110" x2="434" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
1642
+ <line x1="434" y1="110" x2="598" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
1643
+ <line x1="434" y1="110" x2="758" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
1644
+ <rect x="35" y="170" width="150" height="34" rx="7" fill="rgba(124,196,255,.08)" stroke="rgba(124,196,255,.25)" stroke-width="1"/>
1645
+ <text x="110" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">paraswap</text>
1646
+ <rect x="195" y="170" width="150" height="34" rx="7" fill="rgba(124,196,255,.08)" stroke="rgba(124,196,255,.25)" stroke-width="1"/>
1647
+ <text x="270" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">cow protocol</text>
1648
+ <rect x="359" y="170" width="150" height="34" rx="7" fill="rgba(124,196,255,.08)" stroke="rgba(124,196,255,.25)" stroke-width="1"/>
1649
+ <text x="434" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">uniswap v3</text>
1650
+ <rect x="523" y="170" width="150" height="34" rx="7" fill="rgba(124,196,255,.08)" stroke="rgba(124,196,255,.25)" stroke-width="1"/>
1651
+ <text x="598" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">lifi</text>
1652
+ <rect x="683" y="170" width="150" height="34" rx="7" fill="rgba(124,196,255,.08)" stroke="rgba(124,196,255,.25)" stroke-width="1"/>
1653
+ <text x="758" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">uniswap v4</text>
1654
+ <line x1="110" y1="204" x2="110" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
1655
+ <line x1="270" y1="204" x2="270" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
1656
+ <line x1="434" y1="204" x2="434" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
1657
+ <line x1="598" y1="204" x2="598" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
1658
+ <line x1="758" y1="204" x2="758" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
1659
+ <rect x="334" y="248" width="200" height="40" rx="8" fill="rgba(124,196,255,.15)" stroke="var(--blue)" stroke-width="1.5"/>
1660
+ <text x="434" y="271" text-anchor="middle" fill="var(--warm)" font-family="var(--mono)" font-size="12">ranked net of cost</text>
1661
+ <line x1="110" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
1662
+ <line x1="270" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
1663
+ <line x1="434" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
1664
+ <line x1="598" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
1665
+ <line x1="758" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
1666
+ </svg>
1667
+ </figure>
1668
+
1669
+
1670
+
1671
+ <div class="strategy-grid">
1672
+ <article class="strategy-card">
1673
+ <div class="mode">read · model · prepare</div>
1674
+ <h4>LP rebalancing</h4>
1675
+ <p>Read concentrated-liquidity positions, model new ranges and fee drag, then prepare collect, swap and redeploy steps on supported venues. You sign each step.</p>
1676
+ </article>
1677
+ <article class="strategy-card">
1678
+ <div class="mode">monitor · shadow · simulate</div>
1679
+ <h4>MEV</h4>
1680
+ <p>Monitor cross-venue divergence and simulate net edge after gas, slippage and lender costs. Public mode is shadow analysis, not autonomous execution.</p>
1681
+ </article>
1682
+ <article class="strategy-card">
1683
+ <div class="mode">simulate · policy-check</div>
1684
+ <h4>Flash loans</h4>
1685
+ <p>Build bounded atomic loan routes and test premium, calldata, gas and minimum-profit gates. Public live execution remains disabled.</p>
1686
+ </article>
1687
+ <article class="strategy-card">
1688
+ <div class="mode">read · quote · prepare</div>
1689
+ <h4>Staking</h4>
1690
+ <p>Compare validators, staking vaults, rewards and unlock periods, then prepare supported stake, withdraw and delegate actions for your signature.</p>
1691
+ </article>
1692
+ <article class="strategy-card">
1693
+ <div class="mode">discover · compare · prepare</div>
1694
+ <h4>Yield</h4>
1695
+ <p>Rank staking, vault and LP opportunities by net APY after fees, liquidity, lockups and smart-contract risk, then prepare supported deposits or migrations for your signature.</p>
1696
+ </article>
1697
+ <article class="strategy-card">
1698
+ <div class="mode">model · hedge · prepare</div>
1699
+ <h4>Farming methods</h4>
1700
+ <p>Six delta-aware playbooks, from stablecoin loops to collateral-plus-perp hedges and LP incentive hedges. Each one carries explicit exposure, hedge, monitoring and exit rules rather than a bare APR.</p>
1701
+ </article>
1702
+ <article class="strategy-card">
1703
+ <div class="mode">hedge · fund · rebalance</div>
1704
+ <h4>Delta neutral</h4>
1705
+ <p>Pair a spot or LP leg against a short perp so the position earns funding and fees without directional exposure. Oracle reads both legs, models funding, borrow and rebalance drag, then prepares each leg for your signature.</p>
1706
+ </article>
1707
+ <article class="strategy-card">
1708
+ <div class="mode">split · schedule · prepare</div>
1709
+ <h4>TWAP accumulate &amp; distribute</h4>
1710
+ <p>Buy or sell over time instead of in one print. Oracle splits the notional into scheduled child orders, prices each against live venue depth, and prepares them individually so a single fill never moves the market against you. Same engine for distribution — size each tranche, cap participation, keep every child order unsigned.</p>
1711
+ </article>
1712
+ <article class="strategy-card">
1713
+ <div class="mode">route · revoke · bridge</div>
1714
+ <h4>deBridge · ChangeNOW · LI.FI · revoke.cash</h4>
1715
+ <p>Bridge and cross-chain integration with deBridge, ChangeNOW, LI.FI, Squid, Stargate, THORChain, Bungee, Connext, Wormhole, and Across. Every route checks revoke.cash before execution — Oracle prepares the unsigned tx, you sign.</p>
1716
+ </article>
1717
+ <article class="strategy-card">
1718
+ <div class="mode">discover · score · rank</div>
1719
+ <h4>Live farm discovery</h4>
1720
+ <p>Scan live pools across chains and score each candidate on net APR after estimated borrow, funding and gas, minus a risk haircut for thin TVL. Ranked candidates feed straight into a prepare plan.</p>
1721
+ </article>
1722
+ <article class="strategy-card">
1723
+ <div class="mode">alert · shadow · notify</div>
1724
+ <h4>Custom alerts + shadow trading</h4>
1725
+ <p>Follow favorite chains, wallets, funds and deployer addresses, then get notified when one opens, rotates or exits. Run the playbook in shadow mode against live prices before you arm it for live execution.</p>
1726
+ </article>
1727
+
1728
+ </div>
1729
+ <div class="strategy-posture"><b>Public posture:</b> research, simulation and unsigned preparation. MEV and flash-loan broadcast stays off; supported staking, LP, yield and farming actions require the user wallet to sign. Farm discovery reads live third-party yield data. Custom alerts and shadow loops notify or simulate first; live execution still requires arming and a user signature.</div>
1730
+
1731
+ </div>
1732
+ </div>
1733
+
1734
+ <section class="section" id="chains">
1735
+ <p class="section-label rv">Chains</p>
1736
+ <h2 class="section-title rv">Where you can <em>operate.</em></h2>
1737
+ <p class="section-lede rv">Every chain reads live. <b>Route</b> means Oracle can also price and prepare a swap there; <b>read only</b> means the venue registry is still empty, so routing fail-closes rather than guessing a router. Any EVM chain can be registered with a chain id and an RPC.</p>
1738
+ <div class="chain-grid" id="chain-grid"></div>
1739
+ <div class="hl-surface rv">
1740
+ <div class="venues-head"><span>hyperliquid // what oracle actually does</span></div>
1741
+ <div class="hl-grid">
1742
+ <article><h3>Perps</h3><p>Asset info, order + bracket prepare, cancel, leverage and isolated-margin updates. Tick and lot sizing enforced to 5 sig figs.</p></article>
1743
+ <article><h3>Spot &amp; markets</h3><p>Spot meta, mids, L2 book, candles, market and coin datapoints, leaderboards.</p></article>
1744
+ <article><h3>Staking</h3><p>Validator summaries, delegations, rewards and history. Stake deposit, withdraw and delegate prepare with a 7-day unstaking queue.</p></article>
1745
+ <article><h3>Outcome markets</h3><p>HIP-4 outcome listing plus order and cancel prepare.</p></article>
1746
+ <article><h3>Account state</h3><p>Clearinghouse state, open orders, user fills, positions.</p></article>
1747
+ <article><h3>HyperEVM</h3><p>Token search and metadata on Hyperliquid, routed with the EVM lane.</p></article>
1748
+ </div>
1749
+ </div>
1750
+ </section>
1751
+ <section class="section cli-section" id="cli">
1752
+ <p class="section-label rv">Oracle CLI</p>
1753
+ <h2 class="section-title rv">One surface. <em>Every chain.</em></h2>
1754
+ <div class="cli-install rv">
1755
+ <div class="cli-install-cmd"><code>oracle</code> <span class="cli-install-hint">npm install -g @oracle-agent/oracle</span></div>
1756
+ <p class="cli-install-gate"><b>Locals Only</b> Holders get 0% Oracle fees. The CLI recognises your agent wallet and applies the holder rate automatically. The public package never touches keys.</p>
1757
+ </div>
1758
+ <p class="section-lede rv">The real Oracle shell, isolated from desktop chrome. No accounts, no servers. The CLI runs on your machine and reads straight from public RPCs.</p>
1759
+ <p class="section-lede rv">Pin the active surface with <code style="color:var(--blue2)">/chain hyperliquid</code>, switch models, ask naturally. Oracle reads, prices, and prepares — you sign.</p>
1760
+ <div class="convert-grid rv">
1761
+ <div>
1762
+ <figure class="cli-frame cli-proof">
1763
+ <img id="cli-still" src="assets/cli-chain-hyperliquid.jpg?v=cli-visible" alt="Oracle CLI selecting Hyperliquid with the /chain hyperliquid command, showing the active surface: chain, chain id, agent, HyperCore and HyperEVM" width="1600" height="900" loading="eager" fetchpriority="high" />
1764
+ </figure>
1765
+ <p class="cli-cap">actual oracle shell</p>
1766
+ </div>
1767
+ <div class="convert-copy">
1768
+ <p>The active chain follows each read, quote, prepare, and bounded execution path.</p>
1769
+ <div class="convert-pills">
1770
+ <span>HyperCore + HyperEVM</span>
1771
+ <span>multichain routing</span>
1772
+ <span>self-custody</span>
1773
+ </div>
1774
+ <h2 class="section-title app-shot-title">Oracle Desktop App</h2>
1775
+ <figure class="app-shot">
1776
+ <img src="assets/desktop-app.jpg" width="1736" height="959" loading="lazy" decoding="async" alt="Oracle desktop app showing the specialist mesh, with Portfolio, Approvals, Prepare, CLI, Farming Methods, Agent Connect, Receipts, Campaigns and Routes panes.">
1777
+ <figcaption>Portfolio, approvals, prepare, farming, receipts and routes in one pane.</figcaption>
1778
+ </figure>
1779
+ <div class="os-dl"><a class="os-link" href="https://github.com/demi-hl/oracle/releases/download/v0.2.0/Oracle-0.2.0-arm64.dmg">macOS</a><a class="os-link" href="https://github.com/demi-hl/oracle/releases/download/v0.2.0/Oracle-0.2.0.AppImage">Linux</a><a class="os-link" href="https://github.com/demi-hl/oracle/releases/download/v0.2.0/Oracle-Setup-0.2.0.exe">Windows</a></div>
1780
+ </div>
1781
+ </div>
1782
+ </section>
1783
+
1784
+ <section class="section" id="custody" style="padding-top:clamp(48px,8vh,80px)">
1785
+ <div class="strip-inner rv" style="border:1px solid var(--line);border-radius:16px;padding:22px 24px;display:flex;flex-wrap:wrap;gap:18px 28px;align-items:center;justify-content:space-between;background:linear-gradient(180deg, rgba(124,196,255,.05), transparent)">
1786
+ <div class="strip-left">
1787
+ <strong style="font-family:var(--display);font-weight:400;font-size:26px;display:block;margin-bottom:6px">You keep custody.</strong>
1788
+ <span style="font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--mute)">oracle never holds your keys</span>
1789
+ </div>
1790
+ <div class="strip-right" style="display:flex;flex-wrap:wrap;gap:10px">
1791
+ <span class="pill on" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid rgba(124,196,255,.35);border-radius:999px;padding:9px 12px;color:var(--blue)">Multi-wallet</span>
1792
+ <span class="pill on" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid rgba(124,196,255,.35);border-radius:999px;padding:9px 12px;color:var(--blue)">Per-wallet limits</span>
1793
+ <span class="pill" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid var(--line);border-radius:999px;padding:9px 12px;color:var(--cool)">Revoke anytime</span>
1794
+ </div>
1795
+ </div>
1796
+ </section>
1797
+
1798
+ <div class="mega-oracle rv" aria-hidden="true">oracle</div>
1799
+ <footer>
1800
+ <div class="foot-row">
1801
+ <div class="powered">
1802
+ powered by
1803
+ <a href="https://hermes-agent.nousresearch.com" target="_blank" rel="noopener noreferrer">Hermes</a>
1804
+ </div>
1805
+ <div class="foot-links">
1806
+ <a href="/oracle-console/">Console</a>
1807
+ <a href="https://hermes-agent.nousresearch.com/docs" target="_blank" rel="noopener noreferrer">Docs</a>
1808
+ </div>
1809
+ </div>
1810
+ <div class="foot-meta">
1811
+ <span>oracle · <a class="labs-link" href="https://demi.la">locals only labs</a></span>
1812
+ <span>self custodial // locals only labs</span>
1813
+ </div>
1814
+ </footer>
1815
+
1816
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/gsap.min.js"></script>
1817
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/ScrollTrigger.min.js"></script>
1818
+ <script src="https://cdn.jsdelivr.net/npm/lenis@1.3.11/dist/lenis.min.js"></script>
1819
+ <script>
1820
+ (function () {
1821
+ "use strict";
1822
+ document.documentElement.classList.add("js");
1823
+
1824
+ var ICON = "https://icons.llamao.fi/icons/";
1825
+ var CHAINS = [
1826
+ { name: "Ethereum", id: "1", logo: "chains/rsz_ethereum", note: "evm / bridge agent", badge: "route" },
1827
+ { name: "Base", id: "8453", logo: "chains/rsz_base", note: "evm / bridge agent", badge: "route" },
1828
+ { name: "Arbitrum", id: "42161", logo: "chains/rsz_arbitrum", note: "evm / bridge agent", badge: "route" },
1829
+ { name: "Optimism", id: "10", logo: "chains/rsz_optimism", note: "evm / bridge agent", badge: "route" },
1830
+ { name: "BNB Chain", id: "56", logo: "chains/rsz_binance", note: "evm / bridge agent", badge: "route" },
1831
+ { name: "Avalanche", id: "43114", logo: "chains/rsz_avalanche", note: "evm / bridge agent", badge: "route" },
1832
+ { name: "Polygon", id: "137", logo: "chains/rsz_polygon", note: "evm / bridge agent", badge: "route" },
1833
+ { name: "Robinhood", id: "4663", logo: "chains/rsz_robinhood", note: "robinhood agent", badge: "route" },
1834
+ { name: "Hyperliquid", id: "999", logo: "chains/rsz_hyperliquid", note: "hyperliquid agent", badge: "route" },
1835
+ { name: "Abstract", id: "2741", logo: "chains/rsz_abstract", note: "open / add agent", badge: "route" },
1836
+ { name: "Stable", id: "988", logo: "chains/rsz_stable", note: "stable agent", badge: "route" },
1837
+ { name: "Solana", id: "SOL", logo: "chains/rsz_solana", note: "solana agent", badge: "route" },
1838
+ { name: "Bitcoin", id: "BTC", logo: "chains/rsz_bitcoin", note: "bitcoin agent", badge: "route" }
1839
+ ];
1840
+ document.getElementById("chain-grid").innerHTML = CHAINS.map(function (c) {
1841
+ var cls = c.badge === "route" ? "badge live" : "badge";
1842
+ var label = c.badge === "route" ? "route" : "read only";
1843
+ return '<article class="chain rv"><div class="chain-top"><div class="nm">' + c.name +
1844
+ ' <img src="' + ICON + c.logo + '?w=36&h=36" alt="' + c.name + ' logo" loading="lazy"></div></div><div class="meta"><span>' + c.note + '</span><span class="' + cls + '">' + label + '</span></div></article>';
1845
+ }).join("");
1846
+
1847
+ var WM = "assets/wordmarks/";
1848
+ var BRAND = "brand/";
1849
+ var PROTOS_A = [
1850
+ { n: "Uniswap V3", wm: "uniswap.svg", cap: "read + quote + prepare + policy", u: "https://app.uniswap.org/" },
1851
+ { n: "Aerodrome Slipstream", wm: "aerodrome.svg", cap: "read + quote + prepare", u: "https://aerodrome.finance/" },
1852
+ { n: "Pancake V3", wm: "pancakeswap.svg", cap: "read + quote", u: "https://pancakeswap.finance/swap" },
1853
+ { n: "LFJ Liquidity Book", img: "lfj", cap: "read + quote", u: "https://lfj.gg/avalanche/trade" },
1854
+ { n: "Curve RouterNG", img: "curve", cap: "read + quote + prepare + policy", u: "https://curve.finance" },
1855
+ { n: "Pendle Router", wm: "pendle.png", cap: "read + quote + prepare + policy", u: "https://pendle.finance/" },
1856
+ { n: "Morpho vaults", wm: "morpho.svg", cap: "read + deposit prepare", u: "https://app.morpho.org/" },
1857
+ { n: "Lido stETH", img: "lido", cap: "read + stake prepare + policy", u: "https://lido.fi/" },
1858
+ { n: "Kinetiq kHYPE", wm: "kinetiq.svg", tall: 1, cap: "read + quote + stake prepare + policy", u: "https://kinetiq.xyz/stake" },
1859
+ { n: "Project X", img: "projectx", cap: "read", u: "https://www.prjx.com" },
1860
+ { n: "Uniswap V4", img: "uniswapv4", cap: "read + quote", u: "https://app.uniswap.org/" },
1861
+ { n: "Aborean CL", img: "aborean", cap: "read + quote", u: "https://aborean.finance/" },
1862
+ { n: "Aborean AMM", img: "aborean", cap: "read + quote", u: "https://aborean.finance/" },
1863
+ { n: "Stable Swap V3", img: "stableswap", cap: "read + quote", u: "https://swap.stable.xyz/" },
1864
+ { n: "Stable Swap V2", img: "stableswap", cap: "read + quote", u: "https://swap.stable.xyz/" },
1865
+ { n: "Compound V3", img: "compound", cap: "read + quote", u: "https://www.compound.xyz/" },
1866
+ { n: "Aerodrome V1", img: "aerodrome", cap: "read + quote", u: "https://aerodrome.finance/" },
1867
+ { n: "Ethena sUSDe", img: "ethena", cap: "read + quote", u: "https://app.ethena.fi/" },
1868
+ { n: "Lido wstETH", img: "lido", cap: "read + quote", u: "https://lido.fi/" },
1869
+ { n: "Benqi sAVAX", img: "benqi", cap: "read + quote", u: "https://app.benqi.fi/savax" },
1870
+ { n: "EigenLayer", img: "eigenlayer", cap: "read + quote", u: "https://www.eigencloud.xyz/eigenlayer" },
1871
+ { n: "SSV Network", img: "ssv", cap: "read", u: "https://ssv.network/" },
1872
+ { n: "Fluid Lending", img: "fluid", cap: "read + quote", u: "https://www.fluid.io/" },
1873
+ { n: "Rain", img: "rain", cap: "read + quote", u: "https://www.rain.one/" },
1874
+ { n: "Derive V2", img: "derive", cap: "read", u: "https://app.derive.xyz" },
1875
+ { n: "PancakeSwap AMM", img: "pancakeswap", cap: "read + quote", u: "https://pancakeswap.finance/" },
1876
+ { n: "Lista Lending", img: "lista", cap: "read + quote", u: "https://lista.org/lending" },
1877
+ { n: "Lista CDP", img: "lista", cap: "read", u: "https://lista.org/" },
1878
+ { n: "Benqi Lending", img: "benqi", cap: "read", u: "https://benqi.fi" },
1879
+ { n: "Pharaoh V3", img: "pharaoh", cap: "read + quote", u: "https://www.phar.gg/" },
1880
+ { n: "Polymarket", wm: "polymarket.png", cap: "read", u: "https://polymarket.com/" },
1881
+ { n: "XSY", img: "xsy", cap: "read", u: "https://xsy.fi" },
1882
+ { n: "Balancer V2", wm: "balancer.svg", cap: "read + quote", u: "https://balancer.fi/" },
1883
+ { n: "Harmonix", img: "harmonix", cap: "read + quote", u: "https://app.harmonix.fi/" },
1884
+ { n: "Hyperliquid HLP", wm: "hyperliquid.svg", cap: "read", u: "https://app.hyperliquid.xyz" },
1885
+ { n: "stHYPE + wstHYPE", img: "sthype", cap: "read + quote", u: "https://app.valantis.xyz" },
1886
+ { n: "Arcus Perps", img: "arcus", cap: "read", u: "https://arcus.xyz/" },
1887
+ { n: "NOXA Fun", img: "noxa", cap: "read + quote", u: "https://fun.noxa.eth.limo/" },
1888
+ { n: "Kona V2", img: "kona", cap: "read + quote", u: "https://kona.surf/" },
1889
+ { n: "Kona Stableswap", img: "kona", cap: "read + quote", u: "https://kona.surf/" },
1890
+ { n: "NOXA DEX V2", img: "noxa", cap: "read", u: "https://fun.noxa.eth.limo/" },
1891
+ { n: "AFI Protocol", img: "afi", cap: "read + quote", u: "https://afiprotocol.xyz/" },
1892
+ { n: "Kelp", img: "kelp", cap: "read + quote", u: "https://kelpdao.xyz/" },
1893
+ { n: "Dolomite", img: "dolomite", cap: "read", u: "https://dolomite.io" },
1894
+ { n: "Camelot V3", img: "camelot", cap: "read + quote", u: "https://camelot.exchange/" },
1895
+ { n: "Beefy", img: "beefy", cap: "read + quote", u: "https://beefy.com" },
1896
+ { n: "BounceBit", img: "bouncebit", cap: "read", u: "https://bouncebit.io/" },
1897
+ { n: "BitFi", img: "bitfi", cap: "read", u: "https://www.bitfi.one/" },
1898
+ { n: "Hypha", img: "hypha", cap: "read + quote", u: "https://www.hypha.sh/" },
1899
+ { n: "40 Acres", img: "fortyacres", cap: "read + quote", u: "https://www.40acres.finance/" },
1900
+ { n: "Hyperbeat", img: "hyperbeat", cap: "read + quote", u: "https://app.hyperbeat.org/" },
1901
+ { n: "GMX V2", wm: "gmx.svg", cap: "read + order attestation", u: "https://gmx.io/" },
1902
+ { n: "Relay", wm: "relay.svg", cap: "route source", u: "https://relay.link/" },
1903
+ { n: "Odos", wm: "odos.svg", cap: "read + route source", u: "https://app.odos.xyz" },
1904
+ { n: "Jupiter", wm: "jupiter.svg", cap: "solana route source", u: "https://jup.ag/" },
1905
+ { n: "Stargate", wm: "stargate.svg", cap: "read + bridge route", u: "https://stargate.finance/" }
1906
+ ];
1907
+ var PROTOS_B = [
1908
+ { n: "Uniswap V3 LP", img: "uniswap", cap: "preview + mint/collect prepare", u: "https://app.uniswap.org/" },
1909
+ { n: "Velodrome V2", wm: "velodrome.svg", cap: "read + quote", u: "https://velodrome.finance/" },
1910
+ { n: "QuickSwap", wm: "quickswap.png", cap: "read + quote", u: "https://quickswap.exchange/" },
1911
+ { n: "HyperSwap V3", wm: "hyperswap.svg", cap: "read + quote", u: "https://app.hyperswap.exchange/" },
1912
+ { n: "Balancer V3", img: "balancer", cap: "read + quote + prepare + policy", u: "https://balancer.fi/" },
1913
+ { n: "Aave V3", img: "aave", cap: "read + supply/withdraw prepare + policy", u: "https://aave.com/" },
1914
+ { n: "Morpho Blue", img: "morpho", cap: "read", u: "https://app.morpho.org" },
1915
+ { n: "Concrete", img: "concrete", cap: "read + quote", u: "https://app.concrete.xyz" },
1916
+ { n: "HyperLend", img: "hyperlend", cap: "read + supply/withdraw prepare + policy", u: "https://app.hyperlend.finance/" },
1917
+ { n: "Kinetiq Earn", img: "kinetiq", cap: "read + quote", u: "https://kinetiq.xyz/stake-hype#kinetiq-earn" },
1918
+ { n: "Kona Lend", img: "konalend", cap: "read + supply/withdraw prepare + policy", u: "https://app.kona.surf/lending" },
1919
+ { n: "Uniswap V2", img: "uniswapv2", cap: "read + quote", u: "https://app.uniswap.org/" },
1920
+ { n: "SakuraSwap AMM", img: "sakuraswap", cap: "read + quote", u: "https://sakuraswap.com/" },
1921
+ { n: "SakuraSwap CLMM", img: "sakuraswap", cap: "read + quote", u: "https://sakuraswap.com/" },
1922
+ { n: "Curve DEX", img: "curve", cap: "read + quote", u: "https://curve.finance" },
1923
+ { n: "Aave V2", img: "aavev2", cap: "read + quote", u: "https://aave.com" },
1924
+ { n: "Velodrome Slipstream", img: "velodrome", cap: "read + quote", u: "https://velodrome.finance/" },
1925
+ { n: "Sky sUSDS", img: "sky", cap: "read + quote", u: "https://app.sky.money/" },
1926
+ { n: "ether.fi weETH", img: "etherfi", cap: "read + quote", u: "https://www.ether.fi/" },
1927
+ { n: "SparkLend", img: "spark", cap: "read + supply/withdraw prepare + policy", u: "https://spark.finance/" },
1928
+ { n: "Binance wBETH", img: "wbeth", cap: "read + quote", u: "https://www.binance.com/en/wbeth" },
1929
+ { n: "Spark Savings", img: "sparksavings", cap: "read + quote", u: "https://spark.finance/" },
1930
+ { n: "Fluid DEX", img: "fluid", cap: "read + quote", u: "https://www.fluid.io/" },
1931
+ { n: "ZEROBASE", img: "zerobase", cap: "read", u: "https://app.zerobase.pro/" },
1932
+ { n: "EtherFi Cash", img: "etherfiborrow", cap: "read", u: "https://www.ether.fi/cash" },
1933
+ { n: "Venus", img: "venus", cap: "read + quote", u: "https://app.venus.io/" },
1934
+ { n: "Lista slisBNB", img: "lista", cap: "read + quote", u: "https://lista.org/" },
1935
+ { n: "Solv", img: "solv", cap: "read + quote", u: "https://solv.finance/" },
1936
+ { n: "Avant avUSD", img: "avant", cap: "read + quote", u: "https://app.avantprotocol.com/" },
1937
+ { n: "Yield Yak", img: "yieldyak", cap: "read + quote", u: "https://yieldyak.com/" },
1938
+ { n: "SushiSwap", img: "sushiswap", cap: "read + quote", u: "https://sushi.com/" },
1939
+ { n: "Sphere", img: "sphere", cap: "read", u: "https://sphere.finance/" },
1940
+ { n: "Felix", img: "felix", cap: "read + quote", u: "https://www.usefelix.xyz/" },
1941
+ { n: "Unit", img: "unit", cap: "read", u: "https://hyperunit.xyz/" },
1942
+ { n: "Hyperliquid Spot", img: "hyperliquidspot", cap: "read + quote", u: "https://app.hyperliquid.xyz/" },
1943
+ { n: "Kinetiq kmHYPE", img: "kmhype", cap: "read + quote", u: "https://markets.xyz" },
1944
+ { n: "Lighter Robinhood", img: "lighter", cap: "read", u: "https://robinhoodchain.lighter.xyz/trade/LIT" },
1945
+ { n: "Ekubo", img: "ekubo", cap: "read", u: "https://ekubo.org/" },
1946
+ { n: "Myriad Markets", img: "myriad", cap: "read + quote", u: "https://myriad.markets/markets" },
1947
+ { n: "GASSSS", img: "gassss", cap: "read + quote", u: "https://gassss.xyz" },
1948
+ { n: "Rocket Pool", img: "rocketpool", cap: "read + quote", u: "https://rocketpool.net" },
1949
+ { n: "StakeWise V2", img: "stakewise", cap: "read + quote", u: "https://stakewise.io/" },
1950
+ { n: "Ostium", img: "ostium", cap: "read + quote", u: "https://www.ostium.io/" },
1951
+ { n: "Gains Network", img: "gainsnetwork", cap: "read + quote", u: "https://gains.trade/" },
1952
+ { n: "Aster asBNB", img: "aster", cap: "read + quote", u: "https://www.asterdex.com/en/earn" },
1953
+ { n: "Lorenzo", img: "lorenzo", cap: "read", u: "https://www.lorenzo-protocol.xyz/" },
1954
+ { n: "Trader Joe", img: "joedex", cap: "read + quote", u: "https://lfj.gg/avalanche" },
1955
+ { n: "Folks Finance", img: "folks", cap: "read", u: "https://folks.finance/" },
1956
+ { n: "Velodrome V1", img: "velodrome", cap: "read + quote", u: "https://velodrome.finance/" },
1957
+ { n: "Looped Hype", img: "loopedhype", cap: "read + quote", u: "https://www.loopingcollective.org/" },
1958
+ { n: "LI.FI", wm: "lifi.png", cap: "read + route source", u: "https://li.fi/" },
1959
+ { n: "Velora", img: "velora", cap: "read + route source", u: "https://app.velora.xyz" },
1960
+ { n: "CoW Swap", wm: "cowswap.svg", cap: "read + route source", u: "https://cow.fi/" },
1961
+ { n: "Across", wm: "across.svg", cap: "read + bridge route", u: "https://across.to" }
1962
+ ];
1963
+
1964
+ // Equalize optical weight: constant target area, clamped, then width-capped.
1965
+ function normalizeMark(img) {
1966
+ var ar = img.naturalWidth / img.naturalHeight;
1967
+ if (!isFinite(ar) || ar <= 0) return;
1968
+ var h = Math.sqrt(2600 / ar);
1969
+ h = Math.max(22, Math.min(34, h));
1970
+ if (h * ar > 170) h = 170 / ar;
1971
+ img.style.height = h.toFixed(1) + "px";
1972
+ }
1973
+ function wireMarks(root) {
1974
+ if (!root) return;
1975
+ root.querySelectorAll("img.wm").forEach(function (img) {
1976
+ if (img.complete) {
1977
+ if (!img.classList.contains("tall") && img.naturalWidth) normalizeMark(img);
1978
+ return;
1979
+ }
1980
+ img.addEventListener("load", function () {
1981
+ if (!img.classList.contains("tall")) normalizeMark(img);
1982
+ syncMarqueeVelocity();
1983
+ }, { once: true });
1984
+ });
1985
+ }
1986
+
1987
+ var MARQUEE_PX_PER_SECOND = 20;
1988
+ var marqueeResizeTimer = 0;
1989
+ function syncMarqueeVelocity() {
1990
+ document.querySelectorAll(".track").forEach(function (track) {
1991
+ var distance = track.scrollWidth / 2;
1992
+ if (distance > 0) {
1993
+ track.style.setProperty("--marquee-duration", Math.max(30, distance / MARQUEE_PX_PER_SECOND).toFixed(2) + "s");
1994
+ }
1995
+ });
1996
+ }
1997
+
1998
+ function protocolName(name) {
1999
+ var label = name.replace(/\s+(?:DEX\s+)?V\d+(?:\s+LP)?\b/gi, "").trim();
2000
+ var aliases = [
2001
+ [/^Aerodrome\b/i, "Aerodrome"],
2002
+ [/^Pancake(?:Swap)?\b/i, "PancakeSwap"],
2003
+ [/^LFJ\b/i, "LFJ"],
2004
+ [/^Curve\b/i, "Curve"],
2005
+ [/^Pendle\b/i, "Pendle"],
2006
+ [/^Morpho\b/i, "Morpho"],
2007
+ [/^Lido\b/i, "Lido"],
2008
+ [/^Kinetiq\b/i, "Kinetiq"],
2009
+ [/^Aborean\b/i, "Aborean"],
2010
+ [/^Stable Swap\b/i, "Stable"],
2011
+ [/^Ethena\b/i, "Ethena"],
2012
+ [/^Benqi\b/i, "Benqi"],
2013
+ [/^Fluid\b/i, "Fluid"],
2014
+ [/^Lista\b/i, "Lista"],
2015
+ [/^Hyperliquid\b/i, "Hyperliquid"],
2016
+ [/^Arcus\b/i, "Arcus"],
2017
+ [/^NOXA\b/i, "NOXA"],
2018
+ [/^Kona\b/i, "Kona"],
2019
+ [/^Velodrome\b/i, "Velodrome"],
2020
+ [/^SakuraSwap\b/i, "SakuraSwap"],
2021
+ [/^Spark(?:Lend|\b)/i, "Spark"],
2022
+ [/^(?:ether\.fi|EtherFi)\b/i, "EtherFi"],
2023
+ [/^Sky\b/i, "Sky"],
2024
+ [/^Binance\b/i, "Binance"],
2025
+ [/^Avant\b/i, "Avant"],
2026
+ [/^Aster\b/i, "Aster"],
2027
+ [/^Lighter\b/i, "Lighter"],
2028
+ [/^stHYPE \+ wstHYPE$/i, "Valantis"]
2029
+ ];
2030
+ for (var i = 0; i < aliases.length; i++) {
2031
+ if (aliases[i][0].test(label)) return aliases[i][1];
2032
+ }
2033
+ return label;
2034
+ }
2035
+ function uniqueProtocols(list, seen) {
2036
+ return list.filter(function (x) {
2037
+ var label = protocolName(x.n);
2038
+ if (seen[label]) return false;
2039
+ seen[label] = true;
2040
+ return true;
2041
+ });
2042
+ }
2043
+ function chipRow(list) {
2044
+ var seq = list.concat(list);
2045
+ return seq.map(function (x) {
2046
+ var label = protocolName(x.n);
2047
+ var body = x.img
2048
+ ? '<img class="wm tall" src="' + BRAND + x.img + '.webp" alt="' + label + '" decoding="async">' +
2049
+ '<span class="wordmark">' + label + '</span>'
2050
+ : x.wm
2051
+ ? '<img class="' + (x.tall ? 'wm tall' : 'wm') + (x.mono ? ' mono' : '') + '" src="' + WM + x.wm + '" alt="' + label + '" decoding="async">' +
2052
+ (x.tall ? '<span class="wordmark">' + label + '</span>' : '')
2053
+ : '<span class="wordmark">' + label + '</span>';
2054
+ return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + label + '">' + body + '</a>';
2055
+ }).join("");
2056
+ }
2057
+ (function () {
2058
+ // Marquee is the BREADTH signal (every brand, moving). The per-tier chip
2059
+ // wall that used to sit below it was removed: this section states "110
2060
+ // protocol entries without the list wall", and printing all 110 names in
2061
+ // three stacked grids WAS the list wall.
2062
+ var marqueeSeen = Object.create(null);
2063
+ var trackA = document.getElementById("proto-track-a");
2064
+ var trackB = document.getElementById("proto-track-b");
2065
+ if (trackA) trackA.innerHTML = chipRow(uniqueProtocols(PROTOS_A, marqueeSeen));
2066
+ if (trackB) trackB.innerHTML = chipRow(uniqueProtocols(PROTOS_B, marqueeSeen));
2067
+ wireMarks(trackA);
2068
+ wireMarks(trackB);
2069
+ })();
2070
+
2071
+ function exactProtocolEntries() {
2072
+ var out = [];
2073
+ var seen = Object.create(null);
2074
+ PROTOS_A.concat(PROTOS_B).forEach(function (x) {
2075
+ var key = String(x.n).toLowerCase();
2076
+ if (seen[key]) return;
2077
+ seen[key] = true;
2078
+ out.push(x);
2079
+ });
2080
+ return out;
2081
+ }
2082
+ function renderProtocolAtlas() {
2083
+ var root = document.getElementById("protocol-atlas-grid");
2084
+ var entries = exactProtocolEntries();
2085
+ var routeCount = entries.filter(function (x) { return /quote|route|bridge/i.test(x.cap); }).length;
2086
+ var prepareCount = entries.filter(function (x) { return /prepare|policy|mint|collect|supply|withdraw|stake/i.test(x.cap); }).length;
2087
+ // The hero stat is animated from data-count, so only the atlas value is
2088
+ // written directly here -- otherwise this would stomp the count mid-flight.
2089
+ ["atlas-protocol-count"].forEach(function (id) { var el = document.getElementById(id); if (el) el.textContent = String(entries.length); });
2090
+ // Keep the hero target honest: if the protocol table grows, the number the
2091
+ // counter climbs to grows with it.
2092
+ var heroProto = document.getElementById("hero-protocol-count");
2093
+ if (heroProto) heroProto.setAttribute("data-count", String(entries.length));
2094
+ // Only the atlas count tracks the splash's own chain cards. The hero stat
2095
+ // reports the catalog's 21 wired chainIds, which is a different, larger set.
2096
+ ["atlas-chain-count"].forEach(function (id) { var el = document.getElementById(id); if (el) el.textContent = CHAINS.length + " + EVM"; });
2097
+ var r = document.getElementById("atlas-route-count"); if (r) r.textContent = String(routeCount);
2098
+ var pr = document.getElementById("atlas-prepare-count"); if (pr) pr.textContent = String(prepareCount);
2099
+ if (!root) return;
2100
+ var cards = [
2101
+ ["01", "State engine", "Portfolio, markets, positions, pools, NFTs, ordinals and venue state pulled before any action is proposed.", String(entries.length) + " sources"],
2102
+ ["02", "Route brain", "Quotes and bridges normalize into comparable intents, with slippage, destination and calldata shape surfaced before signing.", routeCount + " route-capable"],
2103
+ ["03", "Policy wall", "Every value-moving path passes local bounds: chain, spender, destination, amount, TTL and simulation posture.", prepareCount + " prepare paths"],
2104
+ ["04", "Wallet handoff", "Oracle prepares. Your wallet signs. Broadcast lives behind owner auth, armed state and receipts.", "self custody"],
2105
+ ["05", "Agent mesh", "Hyperliquid, Polymarket, Solana, Bitcoin, EVM, Stable, Robinhood Chain and protocol builder profiles stay separate.", CHAINS.length + " lanes"],
2106
+ ["06", "Builder layer", "New contracts, route modules and chain-specific scaffolds get generated with checks before deployment ever reaches a wallet.", "extendable"]
2107
+ ];
2108
+ root.innerHTML = cards.map(function (x) {
2109
+ return '<article class="motion-card"><div class="motion-scan"></div><div class="num">' + x[0] + '</div><h3>' + x[1] + '</h3><p>' + x[2] + '</p><div class="sig"><span>oracle</span><span>' + x[3] + '</span></div></article>';
2110
+ }).join("");
2111
+ }
2112
+ renderProtocolAtlas();
2113
+
2114
+
2115
+ var LM = "assets/llms/";
2116
+ var LLMS = [
2117
+ { n: "Hermes Agent", wm: "hermes.png", tall: 1, u: "https://hermes.nousresearch.com" },
2118
+ { n: "Claude", wm: "claude.svg", u: "https://claude.ai" },
2119
+ { n: "Grok", wm: "grok.svg", u: "https://grok.com" },
2120
+ { n: "Codex", wm: "codex-icon.svg", tall: 1, u: "https://openai.com/codex" },
2121
+ { n: "Gemini", wm: "gemini-icon.svg", tall: 1, u: "https://gemini.google.com" },
2122
+ { n: "OpenClaw", wm: "openclaw.svg", tall: 1, u: "https://openclaw.ai" },
2123
+ { n: "Perplexity", wm: "perplexity.svg", u: "https://perplexity.ai" },
2124
+ { n: "Manus", wm: "manus.svg", u: "https://manus.im" },
2125
+ { n: "Cursor", wm: "cursor-icon.svg", tall: 1, u: "https://cursor.com" },
2126
+ { n: "Windsurf", wm: "windsurf.svg", u: "https://windsurf.com" },
2127
+ { n: "DeepSeek", wm: "deepseek.svg", u: "https://deepseek.com" },
2128
+ { n: "Qwen", wm: "qwen.svg", tall: 1, u: "https://chat.qwen.ai" },
2129
+ { n: "Kimi", wm: "kimi-icon.svg", tall: 1, u: "https://kimi.com" }
2130
+ ];
2131
+ document.getElementById("llm-track").innerHTML = LLMS.concat(LLMS).map(function (x) {
2132
+ var cls = x.tall ? "wm tall" : "wm";
2133
+ return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + x.n + '"><img class="' + cls + '" src="' + LM + x.wm + '" alt="' + x.n + '" decoding="async">' + (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '') + '</a>';
2134
+ }).join("");
2135
+
2136
+ wireMarks(document.getElementById("llm-track"));
2137
+ syncMarqueeVelocity();
2138
+ if (document.fonts && document.fonts.ready) document.fonts.ready.then(syncMarqueeVelocity);
2139
+ window.addEventListener("load", syncMarqueeVelocity);
2140
+ window.addEventListener("resize", function () {
2141
+ clearTimeout(marqueeResizeTimer);
2142
+ marqueeResizeTimer = setTimeout(syncMarqueeVelocity, 120);
2143
+ });
2144
+
2145
+ var loader = document.getElementById("loader");
2146
+ window.addEventListener("load", function () {
2147
+ setTimeout(function () { loader.classList.add("out"); }, 650);
2148
+ });
2149
+
2150
+ var reduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
2151
+ var coarse = window.matchMedia("(pointer: coarse)").matches;
2152
+ var activeLenis = null;
2153
+
2154
+
2155
+ if (!reduced && !coarse) {
2156
+ document.querySelectorAll(".home-stat,.motion-card").forEach(function (card) {
2157
+ card.addEventListener("pointermove", function (ev) {
2158
+ var r = card.getBoundingClientRect();
2159
+ var x = (ev.clientX - r.left) / r.width;
2160
+ var y = (ev.clientY - r.top) / r.height;
2161
+ card.style.setProperty("--mx", (x * 100).toFixed(2) + "%");
2162
+ card.style.setProperty("--my", (y * 100).toFixed(2) + "%");
2163
+ if (card.classList.contains("motion-card")) {
2164
+ card.classList.add("is-hot");
2165
+ card.style.transform = "rotateX(" + ((.5 - y) * 5).toFixed(2) + "deg) rotateY(" + ((x - .5) * 7).toFixed(2) + "deg) translateY(-3px)";
2166
+ }
2167
+ });
2168
+ card.addEventListener("pointerleave", function () {
2169
+ if (!card.classList.contains("motion-card")) return;
2170
+ card.classList.remove("is-hot");
2171
+ card.style.transform = "";
2172
+ });
2173
+ });
2174
+ }
2175
+
2176
+ var progress = document.getElementById("progress");
2177
+ var ticking = false;
2178
+ function onScroll() {
2179
+ if (ticking) return;
2180
+ ticking = true;
2181
+ requestAnimationFrame(function () {
2182
+ var h = document.scrollingElement || document.documentElement;
2183
+ var max = h.scrollHeight - h.clientHeight;
2184
+ progress.style.transform = "scaleX(" + (max > 0 ? h.scrollTop / max : 0) + ")";
2185
+ ticking = false;
2186
+ });
2187
+ }
2188
+ window.addEventListener("scroll", onScroll, { passive: true });
2189
+ onScroll();
2190
+
2191
+ var heroOrb = document.getElementById("hero-orb");
2192
+ var heroTitle = document.getElementById("hero-title");
2193
+ if (heroOrb && heroTitle && !reduced) {
2194
+ var px = false;
2195
+ window.addEventListener("scroll", function () {
2196
+ if (px) return;
2197
+ px = true;
2198
+ requestAnimationFrame(function () {
2199
+ var y = window.scrollY;
2200
+ var lim = window.innerHeight * .8;
2201
+ var f = Math.min(y / lim, 1);
2202
+ var art = heroOrb.parentElement;
2203
+ art.style.opacity = String(1 - f);
2204
+ art.style.visibility = f >= 1 ? "hidden" : "visible";
2205
+ art.style.transform = "translateY(" + (Math.min(y, lim) * .28) + "px)";
2206
+ heroTitle.style.transform = "translateY(" + (Math.min(y, lim) * .16) + "px)";
2207
+ heroTitle.style.opacity = String(1 - f * .8);
2208
+ px = false;
2209
+ });
2210
+ }, { passive: true });
2211
+ }
2212
+
2213
+ // Hero is the original CSS orb.
2214
+
2215
+ var nodes = Array.prototype.slice.call(document.querySelectorAll(".rv, .wires"));
2216
+ if (reduced || !("IntersectionObserver" in window)) {
2217
+ nodes.forEach(function (n) { n.classList.add("in"); n.classList.add("done"); });
2218
+ } else {
2219
+ var io = new IntersectionObserver(function (entries) {
2220
+ entries.forEach(function (e) {
2221
+ if (e.isIntersecting) {
2222
+ e.target.classList.add("in");
2223
+ (function (el) { setTimeout(function () { el.classList.add("done"); }, 1100); })(e.target);
2224
+ io.unobserve(e.target);
2225
+ }
2226
+ });
2227
+ }, { threshold: 0.01, rootMargin: "0px 0px -2% 0px" });
2228
+ nodes.forEach(function (n) { io.observe(n); });
2229
+ setTimeout(function () {
2230
+ nodes.forEach(function (n) { n.classList.add("in"); n.classList.add("done"); });
2231
+ }, 2600);
2232
+ }
2233
+
2234
+ function splitWords(root) {
2235
+ root.querySelectorAll("[data-split]").forEach(function (el) {
2236
+ if (el.dataset.splitDone) return;
2237
+ el.dataset.splitDone = "1";
2238
+ el.innerHTML = el.textContent.split(/(\s+)/).map(function (w) {
2239
+ if (/^\s+$/.test(w)) return w;
2240
+ return '<span class="word-mask"><span>' + w + '</span></span>';
2241
+ }).join("");
2242
+ });
2243
+ }
2244
+ function initPremiumMotion() {
2245
+ if (reduced || coarse || !window.gsap) return;
2246
+ var gsap = window.gsap;
2247
+ if (window.ScrollTrigger) gsap.registerPlugin(window.ScrollTrigger);
2248
+ var LenisCtor = typeof window.Lenis === "function" ? window.Lenis : (window.Lenis && window.Lenis.Lenis);
2249
+ if (LenisCtor && window.ScrollTrigger) {
2250
+ activeLenis = new LenisCtor({ lerp:.08, smoothWheel:true, wheelMultiplier:.86 });
2251
+ activeLenis.on("scroll", window.ScrollTrigger.update);
2252
+ gsap.ticker.add(function (time) { activeLenis.raf(time * 1000); });
2253
+ gsap.ticker.lagSmoothing(0);
2254
+ }
2255
+ splitWords(document);
2256
+ if (window.ScrollTrigger) {
2257
+ gsap.fromTo("[data-split] .word-mask > span", { yPercent:112, rotate:2 }, { yPercent:0, rotate:0, duration:1.1, ease:"power4.out", stagger:.035, scrollTrigger:{ trigger:"#protocols", start:"top 78%" }, clearProps:"transform" });
2258
+ gsap.to(".hero-art", { yPercent:18, scale:.9, ease:"none", scrollTrigger:{ trigger:".home", start:"top top", end:"bottom top", scrub:true } });
2259
+ gsap.fromTo(".motion-card", { y:80, rotateX:8, scale:.965 }, { y:0, rotateX:0, scale:1, duration:1.25, ease:"power4.out", stagger:.08, scrollTrigger:{ trigger:".operator-grid", start:"top 82%" }, clearProps:"transform" });
2260
+ gsap.to(".motion-command", { y:-34, rotateX:3, ease:"none", scrollTrigger:{ trigger:".motion-lab", start:"top 70%", end:"bottom top", scrub:true } });
2261
+ gsap.to(".mega-oracle", { xPercent:-8, ease:"none", scrollTrigger:{ trigger:".mega-oracle", start:"top bottom", end:"bottom top", scrub:true } });
2262
+ }
2263
+ document.documentElement.classList.add("premium-motion");
2264
+ }
2265
+ initPremiumMotion();
2266
+
2267
+ function scrollToHash(hash) {
2268
+ var target = document.getElementById(hash.slice(1));
2269
+ if (!target) return false;
2270
+ var top = target.getBoundingClientRect().top + (document.scrollingElement || document.documentElement).scrollTop - 88;
2271
+ if (activeLenis && activeLenis.scrollTo) activeLenis.scrollTo(top, { duration: 1.05, easing: function (t) { return 1 - Math.pow(1 - t, 4); } });
2272
+ else window.scrollTo({ top: top, behavior: reduced ? "auto" : "smooth" });
2273
+ return true;
2274
+ }
2275
+ document.querySelectorAll('a[href^="#"]').forEach(function (a) {
2276
+ a.addEventListener("click", function (ev) {
2277
+ var hash = a.getAttribute("href");
2278
+ if (!hash || hash === "#") return;
2279
+ if (scrollToHash(hash)) {
2280
+ ev.preventDefault();
2281
+ history.replaceState(null, "", hash);
2282
+ }
2283
+ });
2284
+ });
2285
+ if (location.hash) setTimeout(function () { scrollToHash(location.hash); }, 60);
2286
+
2287
+ var canvas = document.getElementById("gl");
2288
+ if (!canvas || reduced || coarse) return;
2289
+ var gl = canvas.getContext("webgl", { antialias:false, alpha:false, depth:false, stencil:false, premultipliedAlpha:false });
2290
+ if (!gl) return;
2291
+
2292
+ var vs = "attribute vec2 p;void main(){gl_Position=vec4(p,0.,1.);}";
2293
+ var fs = [
2294
+ "precision highp float;",
2295
+ "uniform vec2 r; uniform float t;",
2296
+ "float hash(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}",
2297
+ "float noise(vec2 p){vec2 i=floor(p),f=fract(p);float a=hash(i),b=hash(i+vec2(1.,0.)),c=hash(i+vec2(0.,1.)),d=hash(i+vec2(1.,1.));vec2 u=f*f*(3.-2.*f);return mix(a,b,u.x)+(c-a)*u.y*(1.-u.x)+(d-b)*u.x*u.y;}",
2298
+ "void main(){",
2299
+ " vec2 uv=(gl_FragCoord.xy-.5*r)/min(r.x,r.y);",
2300
+ " vec2 p=uv*1.15; float tt=t*.08;",
2301
+ " float n=noise(p*2.2+vec2(tt*.6,-tt*.4)); n+=.5*noise(p*4.6-vec2(tt,tt*.7)); n*=.55;",
2302
+ " vec2 g=abs(fract(p*6.5)-.5); float grid=smoothstep(.06,0.,min(g.x,g.y));",
2303
+ " float d=length(p); float rings=0.;",
2304
+ " for(float i=0.;i<4.;i++){float ph=fract(tt*.35+i*.21);float rad=.08+ph*1.15;rings+=exp(-pow((d-rad)*28.,2.))*(1.-ph);}",
2305
+ " float nodes=0.;",
2306
+ " for(float i=0.;i<12.;i++){float a=i*2.399963;vec2 o=vec2(cos(a+tt*.2),sin(a-tt*.15))*(.18+.05*sin(tt+i));nodes+=exp(-dot(p-o,p-o)*420.);}",
2307
+ " vec3 bg=vec3(0.043,0.063,0.094);",
2308
+ " vec3 blue=vec3(0.486,0.769,1.0);",
2309
+ " vec3 cool=vec3(0.655,0.847,1.0);",
2310
+ " vec3 col=bg;",
2311
+ " col+=blue*(n*.2); col+=blue*grid*.05;",
2312
+ " col+=mix(blue,cool,.35)*rings*.22; col+=blue*nodes*.5;",
2313
+ " col+=blue*exp(-d*d*1.8)*.08;",
2314
+ " float vig=pow(max(1.-dot(uv*.72,uv*.72),0.),1.55);",
2315
+ " col*=vig; gl_FragColor=vec4(col,1.);",
2316
+ "}"
2317
+ ].join("\n");
2318
+
2319
+ function compile(type, src){var s=gl.createShader(type);gl.shaderSource(s,src);gl.compileShader(s);return s;}
2320
+ var prog=gl.createProgram();
2321
+ gl.attachShader(prog,compile(gl.VERTEX_SHADER,vs));
2322
+ gl.attachShader(prog,compile(gl.FRAGMENT_SHADER,fs));
2323
+ gl.linkProgram(prog);gl.useProgram(prog);
2324
+ var buf=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buf);
2325
+ gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),gl.STATIC_DRAW);
2326
+ var loc=gl.getAttribLocation(prog,"p");gl.enableVertexAttribArray(loc);gl.vertexAttribPointer(loc,2,gl.FLOAT,false,0,0);
2327
+ var uR=gl.getUniformLocation(prog,"r"), uT=gl.getUniformLocation(prog,"t");
2328
+ var running=true;
2329
+ function resize(){
2330
+ var dpr=Math.min(window.devicePixelRatio||1,1.5);
2331
+ var w=Math.floor(canvas.clientWidth*dpr), h=Math.floor(canvas.clientHeight*dpr);
2332
+ if(canvas.width!==w||canvas.height!==h){canvas.width=w;canvas.height=h;gl.viewport(0,0,w,h);}
2333
+ }
2334
+ function frame(now){
2335
+ if(!running) return;
2336
+ resize();
2337
+ gl.uniform2f(uR,canvas.width,canvas.height);
2338
+ gl.uniform1f(uT,now*0.001);
2339
+ gl.drawArrays(gl.TRIANGLES,0,3);
2340
+ requestAnimationFrame(frame);
2341
+ }
2342
+ function fit(){canvas.style.width="100%";canvas.style.height="100%";resize();}
2343
+ fit();
2344
+ window.addEventListener("resize",fit,{passive:true});
2345
+ document.addEventListener("visibilitychange",function(){running=document.visibilityState==="visible";if(running)requestAnimationFrame(frame);});
2346
+ requestAnimationFrame(frame);
2347
+ })();
2348
+ </script>
2349
+ <script>
2350
+ (function(){
2351
+ var orb=document.getElementById("orb-video")||document.getElementById("hero-cli-video");
2352
+ if(orb){
2353
+ var showOrb=function(){orb.classList.add("ready");};
2354
+ if(orb.readyState>=2)showOrb();else orb.addEventListener("loadeddata",showOrb,{once:true});
2355
+ orb.addEventListener("error",function(){orb.style.display="none";},{once:true});
2356
+ var pl=orb.play&&orb.play();if(pl&&pl.catch)pl.catch(function(){});
2357
+ }
2358
+ var vids=[document.getElementById("route-session"),document.getElementById("risk-session")].filter(Boolean);
2359
+ if(!vids.length)return;
2360
+ var reduce=window.matchMedia&&window.matchMedia("(prefers-reduced-motion:reduce)").matches;
2361
+ if(reduce)return;
2362
+ vids.forEach(function(v){
2363
+ function start(){var pr=v.play();if(pr&&pr.catch)pr.catch(function(){});}
2364
+ v.addEventListener("loadeddata",function(){v.classList.add("ready");},{once:true});
2365
+ if(!("IntersectionObserver" in window)){v.preload="auto";start();return;}
2366
+ var io=new IntersectionObserver(function(es){
2367
+ es.forEach(function(e){
2368
+ if(e.isIntersecting){v.preload="auto";start();}
2369
+ else{v.pause();}
2370
+ });
2371
+ },{threshold:.15});
2372
+ io.observe(v);
2373
+ });
2374
+ })();
2375
+ </script>
2376
+ <script>
2377
+ (function () {
2378
+ var cards = [].slice.call(document.querySelectorAll("[data-agent-seq]"));
2379
+ if (!cards.length) return;
2380
+ var reduced = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
2381
+
2382
+ function fill(card) {
2383
+ var typed = card.querySelector(".agent-typed");
2384
+ var caret = card.querySelector(".agent-caret");
2385
+ var out = card.querySelector(".agent-out");
2386
+ if (typed) typed.textContent = card.dataset.ask;
2387
+ if (out) { out.hidden = false; out.classList.add("in"); }
2388
+ if (caret) caret.style.display = "none";
2389
+ }
2390
+
2391
+ function play(card, delay) {
2392
+ if (card.dataset.played) return;
2393
+ card.dataset.played = "1";
2394
+ // Reduced motion still needs the content, just not the theatre.
2395
+ if (reduced) { fill(card); return; }
2396
+ var typed = card.querySelector(".agent-typed");
2397
+ var caret = card.querySelector(".agent-caret");
2398
+ var out = card.querySelector(".agent-out");
2399
+ var box = card.querySelector(".agent-box");
2400
+ var ask = card.dataset.ask;
2401
+ var i = 0;
2402
+ setTimeout(function step() {
2403
+ if (i <= ask.length) {
2404
+ if (box) box.classList.add("focus");
2405
+ typed.textContent = ask.slice(0, i);
2406
+ i += 1;
2407
+ setTimeout(step, 26 + Math.random() * 34);
2408
+ return;
2409
+ }
2410
+ if (caret) caret.style.display = "none";
2411
+ // Send: the field releases focus and the button kicks, like a real submit.
2412
+ if (box) box.classList.remove("focus");
2413
+ card.classList.add("sent");
2414
+ setTimeout(function () { card.classList.remove("sent"); }, 300);
2415
+ // Straight from the question to the answer. The oracle_cli row in
2416
+ // between was implementation detail cluttering the card.
2417
+ setTimeout(function () {
2418
+ if (!out) return;
2419
+ out.hidden = false;
2420
+ requestAnimationFrame(function () { out.classList.add("in"); });
2421
+ }, 700);
2422
+ }, delay);
2423
+ }
2424
+
2425
+ if (!("IntersectionObserver" in window)) { cards.forEach(fill); return; }
2426
+ var io = new IntersectionObserver(function (entries) {
2427
+ entries.forEach(function (e) {
2428
+ if (!e.isIntersecting) return;
2429
+ play(e.target, cards.indexOf(e.target) * 900);
2430
+ io.unobserve(e.target);
2431
+ });
2432
+ }, { threshold: 0.35 });
2433
+ cards.forEach(function (c) { io.observe(c); });
2434
+ })();
2435
+
2436
+ // Hero stats count up when the row scrolls into view. Numbers that snap into
2437
+ // place read as static text; numbers that climb read as a system reporting
2438
+ // itself. Targets live in data-count so the markup stays the source of truth.
2439
+ // The counter waits for the page loader to disappear — an earlier version
2440
+ // fired behind the fullscreen loader, finished, and showed dead numbers.
2441
+ (function () {
2442
+ var stats = document.querySelectorAll(".home-stat b[data-count]");
2443
+ if (!stats.length) return;
2444
+ var reduced = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
2445
+ function paint(el, value) {
2446
+ var suffix = el.getAttribute("data-suffix") || "";
2447
+ el.textContent = String(value);
2448
+ if (suffix) {
2449
+ var s = document.createElement("span");
2450
+ s.className = "stat-suffix";
2451
+ s.textContent = suffix;
2452
+ el.appendChild(s);
2453
+ }
2454
+ }
2455
+ function land(el) {
2456
+ paint(el, el.getAttribute("data-count"));
2457
+ }
2458
+ if (reduced || !("IntersectionObserver" in window)) { stats.forEach(land); return; }
2459
+ function run(el) {
2460
+ var target = parseInt(el.getAttribute("data-count"), 10);
2461
+ if (!isFinite(target)) { land(el); return; }
2462
+ var dur = 1400, t0 = null;
2463
+ function step(ts) {
2464
+ if (t0 === null) t0 = ts;
2465
+ var k = Math.min(1, (ts - t0) / dur);
2466
+ // Ease out cubic: slow settle for the last few frames so the number
2467
+ // visibly lands rather than snapping.
2468
+ var v = Math.round(target * (1 - Math.pow(1 - k, 3)));
2469
+ paint(el, v);
2470
+ if (k < 1) requestAnimationFrame(step); else land(el);
2471
+ }
2472
+ requestAnimationFrame(step);
2473
+ }
2474
+ function start() {
2475
+ var io = new IntersectionObserver(function (entries) {
2476
+ entries.forEach(function (e) {
2477
+ if (!e.isIntersecting || e.target.dataset.counted) return;
2478
+ e.target.dataset.counted = "1";
2479
+ run(e.target);
2480
+ });
2481
+ }, { threshold: 0.4 });
2482
+ stats.forEach(function (el) { io.observe(el); });
2483
+ }
2484
+ var loader = document.getElementById("loader");
2485
+ if (!loader || loader.classList.contains("out")) { start(); }
2486
+ else {
2487
+ loader.addEventListener("transitionend", function go() {
2488
+ if (!loader.classList.contains("out")) return;
2489
+ loader.removeEventListener("transitionend", go);
2490
+ start();
2491
+ });
2492
+ }
2493
+ })();
2494
+ </script>
2495
+ <script>
2496
+ // Scroll-triggered reveal animations
2497
+ (function(){
2498
+ var observer = new IntersectionObserver(function(entries) {
2499
+ entries.forEach(function(e) {
2500
+ if (e.isIntersecting) {
2501
+ e.target.classList.add('revealed');
2502
+ observer.unobserve(e.target);
2503
+ }
2504
+ });
2505
+ }, { threshold: 0.15, rootMargin: '0px 0px -40px 0px' });
2506
+
2507
+ // Animate: section titles, agent panels, strategy cards, profile cards, proto-cards, bridge demo
2508
+ var targets = document.querySelectorAll('.rv, .agent-panel, .strategy-card, .proto-card, .bridge-demo, .strategy-head, .strategy-grid article');
2509
+ for (var i = 0; i < targets.length; i++) {
2510
+ targets[i].style.opacity = '0';
2511
+ targets[i].style.transform = 'translateY(24px)';
2512
+ targets[i].style.transition = 'opacity .6s var(--ease), transform .6s var(--ease)';
2513
+ observer.observe(targets[i]);
2514
+ }
2515
+
2516
+ // CSS class applied on scroll
2517
+ var style = document.createElement('style');
2518
+ style.textContent =
2519
+ '.revealed { opacity: 1 !important; transform: translateY(0) !important; }' +
2520
+ '.strategy-card:nth-child(1) { transition-delay: 0s !important; }' +
2521
+ '.strategy-card:nth-child(2) { transition-delay: .1s !important; }' +
2522
+ '.strategy-card:nth-child(3) { transition-delay: .15s !important; }' +
2523
+ '.strategy-card:nth-child(4) { transition-delay: .2s !important; }' +
2524
+ '.strategy-card:nth-child(5) { transition-delay: .25s !important; }' +
2525
+ '.strategy-card:nth-child(6) { transition-delay: .3s !important; }' +
2526
+ '.strategy-card:nth-child(7) { transition-delay: .35s !important; }' +
2527
+ '.proto-card:nth-child(1) { transition-delay: 0s !important; }' +
2528
+ '.proto-card:nth-child(2) { transition-delay: .06s !important; }' +
2529
+ '.proto-card:nth-child(3) { transition-delay: .12s !important; }' +
2530
+ '.proto-card:nth-child(4) { transition-delay: .18s !important; }' +
2531
+ '.proto-card:nth-child(5) { transition-delay: .24s !important; }' +
2532
+ '.proto-card:nth-child(6) { transition-delay: .3s !important; }';
2533
+ document.head.appendChild(style);
2534
+ })();
2535
+ </script>
2536
+ </body>
2537
+ </html>