@oracle-agent/oracle 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +99 -0
- package/README.md +531 -13
- package/SECURITY.md +112 -0
- package/SETUP.md +317 -0
- package/artifacts/inscription/oracle-was-here-preview.png +0 -0
- package/artifacts/inscription/oracle-was-here.svg +1 -0
- package/artifacts/specialist-packs/oracle-full-crypto.json +298 -0
- package/bin/desk-server.mjs +473 -0
- package/bin/oracle-data-mcp.mjs +1252 -0
- package/bin/oracle-equities.mjs +168 -0
- package/bin/oracle-init.mjs +525 -0
- package/bin/oracle-public-server.mjs +36 -0
- package/bin/oracle-route.mjs +254 -0
- package/bin/oracle-scan.mjs +192 -0
- package/bin/oracle-upgrade.mjs +42 -0
- package/bin/oracle.mjs +28 -19
- package/docs/adding-a-chain.md +229 -0
- package/docs/architecture.md +139 -0
- package/docs/buzz-integration.md +115 -0
- package/docs/cli.md +143 -0
- package/docs/connectors.md +13 -0
- package/docs/hyperliquid-builder-code.md +50 -0
- package/docs/locals-only-fee-waiver.md +34 -0
- package/docs/oracle-pack-standard.md +29 -0
- package/docs/profiles.md +151 -0
- package/docs/public-surface.md +206 -0
- package/examples/add-a-chain.mjs +65 -0
- package/examples/oracle-pack-template.mjs +38 -0
- package/examples/research-a-token.mjs +70 -0
- package/package.json +110 -14
- package/plugins/oracle-owner-gate/__init__.py +288 -0
- package/plugins/oracle-owner-gate/plugin.yaml +9 -0
- package/profiles/_template/SOUL.md +54 -0
- package/profiles/_template/profile.json +22 -0
- package/profiles/bitcoin-agent/SOUL.md +31 -0
- package/profiles/bitcoin-agent/profile.json +32 -0
- package/profiles/hyperliquid-agent/SOUL.md +34 -0
- package/profiles/hyperliquid-agent/profile.json +38 -0
- package/profiles/oracle/SOUL.md +120 -0
- package/profiles/oracle/profile.json +40 -0
- package/profiles/polymarket-agent/SOUL.md +35 -0
- package/profiles/polymarket-agent/profile.json +34 -0
- package/profiles/profile.schema.json +90 -0
- package/profiles/protocol-builder/SOUL.md +57 -0
- package/profiles/protocol-builder/profile.json +39 -0
- package/profiles/robinhood-agent/SOUL.md +53 -0
- package/profiles/robinhood-agent/profile.json +41 -0
- package/profiles/solana-agent/SOUL.md +37 -0
- package/profiles/solana-agent/profile.json +38 -0
- package/profiles/stable-agent/SOUL.md +43 -0
- package/profiles/stable-agent/profile.json +38 -0
- package/protocols/templates/safe-erc20/SECURITY.md +16 -0
- package/protocols/templates/safe-erc20/foundry.toml +12 -0
- package/protocols/templates/safe-erc20/remappings.txt +2 -0
- package/protocols/templates/safe-erc20/src/SafeERC20.sol +53 -0
- package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +72 -0
- package/public/agent-connect/app.js +84 -0
- package/public/agent-connect/index.html +83 -0
- package/public/agent-connect/styles.css +70 -0
- package/public/index.html +12 -0
- package/public/oracle-console/app.js +272 -0
- package/public/oracle-console/bitcoin-wallets.js +206 -0
- package/public/oracle-console/index.html +91 -0
- package/public/oracle-console/styles.css +239 -0
- package/public/oracle-splash/_variants/ice.html +2073 -0
- package/public/oracle-splash/_variants/ivory.html +2075 -0
- package/public/oracle-splash/assets/agents/claude.png +0 -0
- package/public/oracle-splash/assets/agents/codex.png +0 -0
- package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
- package/public/oracle-splash/assets/desktop-app.jpg +0 -0
- package/public/oracle-splash/assets/hero/cli-session-poster.jpg +0 -0
- package/public/oracle-splash/assets/hero/cli-session.mp4 +0 -0
- package/public/oracle-splash/assets/hero/cli-session.webm +0 -0
- package/public/oracle-splash/assets/hero/orb-poster.jpg +0 -0
- package/public/oracle-splash/assets/hero/orb.avif +0 -0
- package/public/oracle-splash/assets/hero/orb.webm +0 -0
- package/public/oracle-splash/assets/hero/risk-session-poster.jpg +0 -0
- package/public/oracle-splash/assets/hero/risk-session.mp4 +0 -0
- package/public/oracle-splash/assets/hero/risk-session.webm +0 -0
- package/public/oracle-splash/assets/hero/route-session-poster.jpg +0 -0
- package/public/oracle-splash/assets/hero/route-session.mp4 +0 -0
- package/public/oracle-splash/assets/hero/route-session.webm +0 -0
- package/public/oracle-splash/assets/llms/claude.svg +1 -0
- package/public/oracle-splash/assets/llms/codex-icon.svg +1 -0
- package/public/oracle-splash/assets/llms/codex.svg +1 -0
- package/public/oracle-splash/assets/llms/cursor-icon.svg +12 -0
- package/public/oracle-splash/assets/llms/cursor.svg +17 -0
- package/public/oracle-splash/assets/llms/deepseek.svg +1 -0
- package/public/oracle-splash/assets/llms/gemini-icon.svg +1 -0
- package/public/oracle-splash/assets/llms/gemini.svg +1 -0
- package/public/oracle-splash/assets/llms/grok.svg +8 -0
- package/public/oracle-splash/assets/llms/hermes.png +0 -0
- package/public/oracle-splash/assets/llms/kimi-icon.svg +1 -0
- package/public/oracle-splash/assets/llms/kimi.svg +1 -0
- package/public/oracle-splash/assets/llms/manus.svg +18 -0
- package/public/oracle-splash/assets/llms/openclaw.svg +22 -0
- package/public/oracle-splash/assets/llms/perplexity.svg +1 -0
- package/public/oracle-splash/assets/llms/qwen.svg +1 -0
- package/public/oracle-splash/assets/llms/windsurf.svg +1 -0
- package/public/oracle-splash/assets/protocols/abcdex.png +0 -0
- package/public/oracle-splash/assets/protocols/across.png +0 -0
- package/public/oracle-splash/assets/protocols/aerodrome.png +0 -0
- package/public/oracle-splash/assets/protocols/balancer.png +0 -0
- package/public/oracle-splash/assets/protocols/cowswap.png +0 -0
- package/public/oracle-splash/assets/protocols/curve.png +0 -0
- package/public/oracle-splash/assets/protocols/dreamcash.png +0 -0
- package/public/oracle-splash/assets/protocols/felix.png +0 -0
- package/public/oracle-splash/assets/protocols/gmx.png +0 -0
- package/public/oracle-splash/assets/protocols/hyena.png +0 -0
- package/public/oracle-splash/assets/protocols/hyperbeat.png +0 -0
- package/public/oracle-splash/assets/protocols/hyperliquid.png +0 -0
- package/public/oracle-splash/assets/protocols/hyperswap.png +0 -0
- package/public/oracle-splash/assets/protocols/jupiter.png +0 -0
- package/public/oracle-splash/assets/protocols/kinetiq.png +0 -0
- package/public/oracle-splash/assets/protocols/lfj.png +0 -0
- package/public/oracle-splash/assets/protocols/lifi.png +0 -0
- package/public/oracle-splash/assets/protocols/magic-eden.png +0 -0
- package/public/oracle-splash/assets/protocols/morpho.png +0 -0
- package/public/oracle-splash/assets/protocols/odos.png +0 -0
- package/public/oracle-splash/assets/protocols/oneinch.png +0 -0
- package/public/oracle-splash/assets/protocols/opensea.png +0 -0
- package/public/oracle-splash/assets/protocols/pancakeswap.png +0 -0
- package/public/oracle-splash/assets/protocols/paragon.png +0 -0
- package/public/oracle-splash/assets/protocols/paraswap.png +0 -0
- package/public/oracle-splash/assets/protocols/pendle.png +0 -0
- package/public/oracle-splash/assets/protocols/polymarket.png +0 -0
- package/public/oracle-splash/assets/protocols/quickswap.png +0 -0
- package/public/oracle-splash/assets/protocols/relay.png +0 -0
- package/public/oracle-splash/assets/protocols/stargate.png +0 -0
- package/public/oracle-splash/assets/protocols/tradexyz.png +0 -0
- package/public/oracle-splash/assets/protocols/uniswap.png +0 -0
- package/public/oracle-splash/assets/protocols/velodrome.png +0 -0
- package/public/oracle-splash/assets/protocols/ventuals.png +0 -0
- package/public/oracle-splash/assets/wordmarks/across-icon.webp +0 -0
- package/public/oracle-splash/assets/wordmarks/across.svg +4 -0
- package/public/oracle-splash/assets/wordmarks/aerodrome.svg +23 -0
- package/public/oracle-splash/assets/wordmarks/balancer.svg +3 -0
- package/public/oracle-splash/assets/wordmarks/cowswap.svg +1 -0
- package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
- package/public/oracle-splash/assets/wordmarks/gmx.svg +13 -0
- package/public/oracle-splash/assets/wordmarks/hop-icon.webp +0 -0
- package/public/oracle-splash/assets/wordmarks/hyena.svg +7 -0
- package/public/oracle-splash/assets/wordmarks/hyperliquid.svg +21 -0
- package/public/oracle-splash/assets/wordmarks/hyperswap.svg +13 -0
- package/public/oracle-splash/assets/wordmarks/jupiter.svg +35 -0
- package/public/oracle-splash/assets/wordmarks/kinetiq.svg +1 -0
- package/public/oracle-splash/assets/wordmarks/lfj.webp +0 -0
- package/public/oracle-splash/assets/wordmarks/lifi.png +0 -0
- package/public/oracle-splash/assets/wordmarks/magic-eden.svg +1 -0
- package/public/oracle-splash/assets/wordmarks/markets.svg +1 -0
- package/public/oracle-splash/assets/wordmarks/morpho.svg +1 -0
- package/public/oracle-splash/assets/wordmarks/odos.svg +3 -0
- package/public/oracle-splash/assets/wordmarks/oneinch-icon.webp +0 -0
- package/public/oracle-splash/assets/wordmarks/oneinch.svg +6 -0
- package/public/oracle-splash/assets/wordmarks/opensea-icon.svg +17 -0
- package/public/oracle-splash/assets/wordmarks/opensea.svg +1 -0
- package/public/oracle-splash/assets/wordmarks/outcome.svg +16 -0
- package/public/oracle-splash/assets/wordmarks/pancakeswap.svg +18 -0
- package/public/oracle-splash/assets/wordmarks/paragon.svg +9 -0
- package/public/oracle-splash/assets/wordmarks/paraswap.svg +16 -0
- package/public/oracle-splash/assets/wordmarks/pendle.png +0 -0
- package/public/oracle-splash/assets/wordmarks/polymarket.png +0 -0
- package/public/oracle-splash/assets/wordmarks/quickswap.png +0 -0
- package/public/oracle-splash/assets/wordmarks/relay.svg +8 -0
- package/public/oracle-splash/assets/wordmarks/satflow-icon.png +0 -0
- package/public/oracle-splash/assets/wordmarks/stargate-icon.webp +0 -0
- package/public/oracle-splash/assets/wordmarks/stargate.svg +15 -0
- package/public/oracle-splash/assets/wordmarks/uniswap.svg +18 -0
- package/public/oracle-splash/assets/wordmarks/velodrome.svg +84 -0
- package/public/oracle-splash/assets/wordmarks/xyz.svg +12 -0
- package/public/oracle-splash/assets/wordmarks/zerox-icon.webp +0 -0
- package/public/oracle-splash/brand/aave.webp +0 -0
- package/public/oracle-splash/brand/aavev2.webp +0 -0
- package/public/oracle-splash/brand/aborean.webp +0 -0
- package/public/oracle-splash/brand/across.webp +0 -0
- package/public/oracle-splash/brand/aerodrome.webp +0 -0
- package/public/oracle-splash/brand/afi.webp +0 -0
- package/public/oracle-splash/brand/arcus.webp +0 -0
- package/public/oracle-splash/brand/aster.webp +0 -0
- package/public/oracle-splash/brand/avant.webp +0 -0
- package/public/oracle-splash/brand/balancer.webp +0 -0
- package/public/oracle-splash/brand/beefy.webp +0 -0
- package/public/oracle-splash/brand/benqi.webp +0 -0
- package/public/oracle-splash/brand/bestinslot.ico +0 -0
- package/public/oracle-splash/brand/bitfi.webp +0 -0
- package/public/oracle-splash/brand/bonkswap.webp +0 -0
- package/public/oracle-splash/brand/bouncebit.webp +0 -0
- package/public/oracle-splash/brand/camelot.webp +0 -0
- package/public/oracle-splash/brand/compound.webp +0 -0
- package/public/oracle-splash/brand/concrete.webp +0 -0
- package/public/oracle-splash/brand/cow.webp +0 -0
- package/public/oracle-splash/brand/curve.webp +0 -0
- package/public/oracle-splash/brand/derive.webp +0 -0
- package/public/oracle-splash/brand/dolomite.webp +0 -0
- package/public/oracle-splash/brand/eigenlayer.webp +0 -0
- package/public/oracle-splash/brand/ekubo.webp +0 -0
- package/public/oracle-splash/brand/ethena.webp +0 -0
- package/public/oracle-splash/brand/etherfi.webp +0 -0
- package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
- package/public/oracle-splash/brand/felix.webp +0 -0
- package/public/oracle-splash/brand/fluid.webp +0 -0
- package/public/oracle-splash/brand/fluxbeam.webp +0 -0
- package/public/oracle-splash/brand/folks.webp +0 -0
- package/public/oracle-splash/brand/fortyacres.webp +0 -0
- package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
- package/public/oracle-splash/brand/gassss.webp +0 -0
- package/public/oracle-splash/brand/gmx.webp +0 -0
- package/public/oracle-splash/brand/harmonix.webp +0 -0
- package/public/oracle-splash/brand/hlorderbook.webp +0 -0
- package/public/oracle-splash/brand/hlp.webp +0 -0
- package/public/oracle-splash/brand/hop.webp +0 -0
- package/public/oracle-splash/brand/hyperbeat.webp +0 -0
- package/public/oracle-splash/brand/hyperlend.webp +0 -0
- package/public/oracle-splash/brand/hyperliquid.webp +0 -0
- package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
- package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
- package/public/oracle-splash/brand/hyperswap.webp +0 -0
- package/public/oracle-splash/brand/hypha.webp +0 -0
- package/public/oracle-splash/brand/joedex.webp +0 -0
- package/public/oracle-splash/brand/jupiter.webp +0 -0
- package/public/oracle-splash/brand/kelp.webp +0 -0
- package/public/oracle-splash/brand/kinetiq.webp +0 -0
- package/public/oracle-splash/brand/kmhype.webp +0 -0
- package/public/oracle-splash/brand/kona.webp +0 -0
- package/public/oracle-splash/brand/konalend.webp +0 -0
- package/public/oracle-splash/brand/lfj.webp +0 -0
- package/public/oracle-splash/brand/lido.webp +0 -0
- package/public/oracle-splash/brand/lifi.webp +0 -0
- package/public/oracle-splash/brand/lighter.webp +0 -0
- package/public/oracle-splash/brand/lista.webp +0 -0
- package/public/oracle-splash/brand/loopedhype.webp +0 -0
- package/public/oracle-splash/brand/lorenzo.webp +0 -0
- package/public/oracle-splash/brand/magic-eden.webp +0 -0
- package/public/oracle-splash/brand/magiceden.webp +0 -0
- package/public/oracle-splash/brand/mempool.png +0 -0
- package/public/oracle-splash/brand/meteora.webp +0 -0
- package/public/oracle-splash/brand/morpho.webp +0 -0
- package/public/oracle-splash/brand/myriad.webp +0 -0
- package/public/oracle-splash/brand/noxa.webp +0 -0
- package/public/oracle-splash/brand/odos.webp +0 -0
- package/public/oracle-splash/brand/oneinch.webp +0 -0
- package/public/oracle-splash/brand/openbook.webp +0 -0
- package/public/oracle-splash/brand/opensea.webp +0 -0
- package/public/oracle-splash/brand/orca.webp +0 -0
- package/public/oracle-splash/brand/ordinals.png +0 -0
- package/public/oracle-splash/brand/ostium.webp +0 -0
- package/public/oracle-splash/brand/pancakeswap.webp +0 -0
- package/public/oracle-splash/brand/pendle.webp +0 -0
- package/public/oracle-splash/brand/perena.webp +0 -0
- package/public/oracle-splash/brand/pharaoh.webp +0 -0
- package/public/oracle-splash/brand/phoenix.webp +0 -0
- package/public/oracle-splash/brand/polymarket.webp +0 -0
- package/public/oracle-splash/brand/polynomial.webp +0 -0
- package/public/oracle-splash/brand/projectx.webp +0 -0
- package/public/oracle-splash/brand/pumpfun.webp +0 -0
- package/public/oracle-splash/brand/quickswap.webp +0 -0
- package/public/oracle-splash/brand/rain.webp +0 -0
- package/public/oracle-splash/brand/raydium.webp +0 -0
- package/public/oracle-splash/brand/relay.webp +0 -0
- package/public/oracle-splash/brand/rocketpool.webp +0 -0
- package/public/oracle-splash/brand/saber.webp +0 -0
- package/public/oracle-splash/brand/sakuraswap.webp +0 -0
- package/public/oracle-splash/brand/sanctum.webp +0 -0
- package/public/oracle-splash/brand/satflow.png +0 -0
- package/public/oracle-splash/brand/sierra.webp +0 -0
- package/public/oracle-splash/brand/sky.webp +0 -0
- package/public/oracle-splash/brand/solv.webp +0 -0
- package/public/oracle-splash/brand/spark.webp +0 -0
- package/public/oracle-splash/brand/sparksavings.webp +0 -0
- package/public/oracle-splash/brand/sphere.webp +0 -0
- package/public/oracle-splash/brand/ssv.webp +0 -0
- package/public/oracle-splash/brand/stabble.webp +0 -0
- package/public/oracle-splash/brand/stableswap.webp +0 -0
- package/public/oracle-splash/brand/stakewise.webp +0 -0
- package/public/oracle-splash/brand/stargate.webp +0 -0
- package/public/oracle-splash/brand/sthype.webp +0 -0
- package/public/oracle-splash/brand/sushiswap.webp +0 -0
- package/public/oracle-splash/brand/unisat.png +0 -0
- package/public/oracle-splash/brand/uniswap.webp +0 -0
- package/public/oracle-splash/brand/uniswapv2.webp +0 -0
- package/public/oracle-splash/brand/uniswapv4.webp +0 -0
- package/public/oracle-splash/brand/unit.webp +0 -0
- package/public/oracle-splash/brand/velodrome.webp +0 -0
- package/public/oracle-splash/brand/velora.webp +0 -0
- package/public/oracle-splash/brand/venus.webp +0 -0
- package/public/oracle-splash/brand/wbeth.webp +0 -0
- package/public/oracle-splash/brand/xsy.webp +0 -0
- package/public/oracle-splash/brand/yieldyak.webp +0 -0
- package/public/oracle-splash/brand/zerobase.webp +0 -0
- package/public/oracle-splash/brand/zerox.webp +0 -0
- package/public/oracle-splash/downloads/index.html +52 -0
- package/public/oracle-splash/favicon.ico +0 -0
- package/public/oracle-splash/favicon.svg +6 -0
- package/public/oracle-splash/index.html +2537 -0
- package/public/oracle-splash/mesh-graph.png +0 -0
- package/public/oracle-splash/mesh-graph.svg +216 -0
- package/scripts/adversarial-bench.mjs +114 -0
- package/scripts/build-dist.mjs +119 -0
- package/scripts/build-inscription.py +230 -0
- package/scripts/check-doc-drift.mjs +123 -0
- package/scripts/check-test-count.mjs +105 -0
- package/scripts/e2e-hl-markets.mjs +21 -0
- package/scripts/e2e-hl-perps.mjs +48 -0
- package/scripts/e2e-hypercore-staking.mjs +128 -0
- package/scripts/e2e-solana-bitcoin.mjs +183 -0
- package/scripts/guard-publish.mjs +22 -0
- package/scripts/protocol-template-gate.mjs +15 -0
- package/scripts/public-api-scan.mjs +23 -0
- package/scripts/publish-dist.mjs +67 -0
- package/scripts/record-hero-cli.sh +80 -0
- package/scripts/secret-scan.mjs +168 -0
- package/scripts/smoke-dist-bins.mjs +89 -0
- package/scripts/verify-dist.mjs +29 -0
- package/scripts/verify-v3-venues.mjs +233 -0
- package/skills/balance/SKILL.md +176 -0
- package/skills/bitcoin-l1.md +33 -0
- package/skills/chain-defi-ecosystem-profiling.md +27 -0
- package/skills/evm-contract-research.md +27 -0
- package/skills/hyperliquid.md +26 -0
- package/skills/multichain-exec-desk.md +33 -0
- package/skills/oracle-action-semantics/SKILL.md +40 -0
- package/skills/oracle-best-execution/SKILL.md +127 -0
- package/skills/oracle-best-execution.md +27 -0
- package/skills/oracle-bitcoin/SKILL.md +53 -0
- package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +59 -0
- package/skills/oracle-chat/SKILL.md +61 -0
- package/skills/oracle-chat/chain.SKILL.md +31 -0
- package/skills/oracle-chat/setup.SKILL.md +37 -0
- package/skills/oracle-circuit-breaker/SKILL.md +51 -0
- package/skills/oracle-contract-research/SKILL.md +55 -0
- package/skills/oracle-desk/SKILL.md +58 -0
- package/skills/oracle-desk.md +27 -0
- package/skills/oracle-dex-launch/SKILL.md +38 -0
- package/skills/oracle-equities/SKILL.md +62 -0
- package/skills/oracle-grants/SKILL.md +69 -0
- package/skills/oracle-hypercore-staking/SKILL.md +57 -0
- package/skills/oracle-hyperliquid/SKILL.md +56 -0
- package/skills/oracle-meme-token-sniper/SKILL.md +73 -0
- package/skills/oracle-multichain-nft-launch/SKILL.md +338 -0
- package/skills/oracle-multichain-token-launch/SKILL.md +300 -0
- package/skills/oracle-nft-gacha-launch/SKILL.md +48 -0
- package/skills/oracle-nft-mint-gas-war/SKILL.md +63 -0
- package/skills/oracle-polymarket/SKILL.md +60 -0
- package/skills/oracle-protocol-builder/SKILL.md +59 -0
- package/skills/oracle-protocol-security/SKILL.md +60 -0
- package/skills/oracle-public-product/SKILL.md +44 -0
- package/skills/oracle-receipts/SKILL.md +52 -0
- package/skills/oracle-receipts.md +29 -0
- package/skills/oracle-rfq-tokenized-assets/SKILL.md +69 -0
- package/skills/oracle-smart-wallet-scanner/SKILL.md +49 -0
- package/skills/oracle-solana/SKILL.md +65 -0
- package/skills/oracle-solana-nft/SKILL.md +54 -0
- package/skills/oracle-token-research/SKILL.md +67 -0
- package/skills/solana.md +22 -0
- package/skins/oracle.yaml +56 -0
- package/src/action-receipts.mjs +265 -0
- package/src/action-semantics.mjs +62 -0
- package/src/address-book.mjs +208 -0
- package/src/agent-auth.mjs +206 -0
- package/src/approval-guard.mjs +282 -0
- package/src/attestation-secret.mjs +94 -0
- package/src/audit-log.mjs +196 -0
- package/src/auth/oauth.mjs +672 -0
- package/src/auto-slippage.mjs +378 -0
- package/src/capability-posture.mjs +125 -0
- package/src/cards.mjs +422 -0
- package/src/chains.mjs +62 -0
- package/src/cli/chain-catalog.mjs +215 -0
- package/src/cli/chain-state.mjs +74 -0
- package/src/cli/commands/auth.mjs +193 -0
- package/src/cli/commands/bootstrap.mjs +87 -0
- package/src/cli/commands/chain.mjs +143 -0
- package/src/cli/commands/chat.mjs +465 -0
- package/src/cli/commands/credential.mjs +9 -0
- package/src/cli/commands/data-mcp.mjs +18 -0
- package/src/cli/commands/data.mjs +75 -0
- package/src/cli/commands/doctor.mjs +136 -0
- package/src/cli/commands/equities.mjs +41 -0
- package/src/cli/commands/farm.mjs +129 -0
- package/src/cli/commands/fees.mjs +109 -0
- package/src/cli/commands/follow.mjs +130 -0
- package/src/cli/commands/harness.mjs +63 -0
- package/src/cli/commands/help.mjs +7 -0
- package/src/cli/commands/init.mjs +27 -0
- package/src/cli/commands/mcp.mjs +154 -0
- package/src/cli/commands/model.mjs +106 -0
- package/src/cli/commands/plugins.mjs +241 -0
- package/src/cli/commands/prepare.mjs +12 -0
- package/src/cli/commands/public.mjs +20 -0
- package/src/cli/commands/resolve.mjs +64 -0
- package/src/cli/commands/route.mjs +12 -0
- package/src/cli/commands/runner.mjs +9 -0
- package/src/cli/commands/scan.mjs +12 -0
- package/src/cli/commands/setup.mjs +294 -0
- package/src/cli/commands/sign.mjs +21 -0
- package/src/cli/commands/signer.mjs +9 -0
- package/src/cli/commands/swap.mjs +102 -0
- package/src/cli/commands/upgrade.mjs +12 -0
- package/src/cli/commands/vault.mjs +9 -0
- package/src/cli/commands/version.mjs +22 -0
- package/src/cli/first-run.mjs +23 -0
- package/src/cli/kernel.mjs +262 -0
- package/src/cli/mcp-targets/chatgpt.mjs +51 -0
- package/src/cli/mcp-targets/claude-code.mjs +39 -0
- package/src/cli/mcp-targets/claude-desktop.mjs +24 -0
- package/src/cli/mcp-targets/codex.mjs +41 -0
- package/src/cli/mcp-targets/cursor.mjs +32 -0
- package/src/cli/mcp-targets/shared.mjs +71 -0
- package/src/cli/mcp-targets/vscode.mjs +39 -0
- package/src/cli/messaging-platforms.mjs +217 -0
- package/src/cli/model-config.mjs +78 -0
- package/src/cli/operator-dispatch.mjs +257 -0
- package/src/cli/oracle-harness.py +415 -0
- package/src/cli/paths.mjs +107 -0
- package/src/cli/runtime.mjs +351 -0
- package/src/cli/setup-state.mjs +168 -0
- package/src/cli/spawn-child.mjs +43 -0
- package/src/data/catalog.mjs +858 -0
- package/src/data/desk-data.mjs +877 -0
- package/src/data/http.mjs +253 -0
- package/src/data/names.mjs +188 -0
- package/src/data/provider-endpoint.mjs +94 -0
- package/src/data/providers/aave-v3.mjs +139 -0
- package/src/data/providers/across-bridge.mjs +41 -0
- package/src/data/providers/aerodrome.mjs +245 -0
- package/src/data/providers/aevo.mjs +33 -0
- package/src/data/providers/approval-indexer.mjs +133 -0
- package/src/data/providers/approvals.mjs +594 -0
- package/src/data/providers/babylon-staking.mjs +149 -0
- package/src/data/providers/balancer.mjs +209 -0
- package/src/data/providers/beefy-yields.mjs +45 -0
- package/src/data/providers/birdeye-tokens.mjs +33 -0
- package/src/data/providers/bisq-markets.mjs +145 -0
- package/src/data/providers/bitcoin-esplora.mjs +216 -0
- package/src/data/providers/bitcoin-meta.mjs +378 -0
- package/src/data/providers/blockscout.mjs +14 -0
- package/src/data/providers/bob-rootstock.mjs +198 -0
- package/src/data/providers/braiins-insights.mjs +103 -0
- package/src/data/providers/bridge-aggregator.mjs +259 -0
- package/src/data/providers/bridges.mjs +242 -0
- package/src/data/providers/bungee.mjs +29 -0
- package/src/data/providers/celestia-da.mjs +38 -0
- package/src/data/providers/changenow.mjs +135 -0
- package/src/data/providers/compound.mjs +32 -0
- package/src/data/providers/connext.mjs +28 -0
- package/src/data/providers/convex.mjs +30 -0
- package/src/data/providers/cow-protocol.mjs +110 -0
- package/src/data/providers/cowswap.mjs +415 -0
- package/src/data/providers/curve.mjs +201 -0
- package/src/data/providers/das-assets.mjs +59 -0
- package/src/data/providers/debridge.mjs +109 -0
- package/src/data/providers/defillama.mjs +88 -0
- package/src/data/providers/dexscreener.mjs +43 -0
- package/src/data/providers/drift.mjs +32 -0
- package/src/data/providers/dydx.mjs +41 -0
- package/src/data/providers/evm-rpc.mjs +225 -0
- package/src/data/providers/farming.mjs +291 -0
- package/src/data/providers/geckoterminal.mjs +34 -0
- package/src/data/providers/gmx.mjs +496 -0
- package/src/data/providers/hiro-stacks.mjs +150 -0
- package/src/data/providers/hl-assets.mjs +165 -0
- package/src/data/providers/hl-info.mjs +108 -0
- package/src/data/providers/hl-markets.mjs +210 -0
- package/src/data/providers/hl-outcome.mjs +61 -0
- package/src/data/providers/hl-perps.mjs +419 -0
- package/src/data/providers/hl-staking.mjs +353 -0
- package/src/data/providers/hl-ws.mjs +119 -0
- package/src/data/providers/hyperevm-dex.mjs +49 -0
- package/src/data/providers/jito-mev.mjs +117 -0
- package/src/data/providers/jupiter-venues.mjs +119 -0
- package/src/data/providers/jupiter.mjs +315 -0
- package/src/data/providers/kamino-strategies.mjs +143 -0
- package/src/data/providers/l2beat-tvl.mjs +42 -0
- package/src/data/providers/lifi.mjs +166 -0
- package/src/data/providers/liquid-esplora.mjs +152 -0
- package/src/data/providers/magiceden-ordinals.mjs +141 -0
- package/src/data/providers/magiceden-sol.mjs +406 -0
- package/src/data/providers/mempool-lightning.mjs +144 -0
- package/src/data/providers/mempool-mining.mjs +142 -0
- package/src/data/providers/meteora-dlmm.mjs +168 -0
- package/src/data/providers/morpho.mjs +177 -0
- package/src/data/providers/nft-gallery.mjs +163 -0
- package/src/data/providers/nft-portfolio.mjs +494 -0
- package/src/data/providers/odos.mjs +156 -0
- package/src/data/providers/ondo.mjs +31 -0
- package/src/data/providers/oneinch.mjs +174 -0
- package/src/data/providers/opensea-multichain.mjs +136 -0
- package/src/data/providers/opensea-nft.mjs +371 -0
- package/src/data/providers/orca.mjs +29 -0
- package/src/data/providers/ordinals-runes.mjs +180 -0
- package/src/data/providers/pancakeswap.mjs +28 -0
- package/src/data/providers/paraswap.mjs +125 -0
- package/src/data/providers/pendle.mjs +188 -0
- package/src/data/providers/poly-clob.mjs +283 -0
- package/src/data/providers/poly-public.mjs +96 -0
- package/src/data/providers/poly-ws.mjs +103 -0
- package/src/data/providers/polygon-staking.mjs +227 -0
- package/src/data/providers/portfolio-history.mjs +394 -0
- package/src/data/providers/portfolio.mjs +600 -0
- package/src/data/providers/pyth-price-feeds.mjs +172 -0
- package/src/data/providers/raydium.mjs +35 -0
- package/src/data/providers/relayscan-mev.mjs +72 -0
- package/src/data/providers/rfq.mjs +15 -0
- package/src/data/providers/rh-agent.mjs +59 -0
- package/src/data/providers/sanctum-lst.mjs +180 -0
- package/src/data/providers/satflow.mjs +341 -0
- package/src/data/providers/signed-material-guard.mjs +108 -0
- package/src/data/providers/solana-rpc.mjs +197 -0
- package/src/data/providers/solend-lending.mjs +166 -0
- package/src/data/providers/spark-lend.mjs +42 -0
- package/src/data/providers/squid-router.mjs +29 -0
- package/src/data/providers/stargate.mjs +29 -0
- package/src/data/providers/sushiswap.mjs +30 -0
- package/src/data/providers/symbiotic-restaking.mjs +41 -0
- package/src/data/providers/thorchain.mjs +36 -0
- package/src/data/providers/traderjoe.mjs +28 -0
- package/src/data/providers/twap.mjs +152 -0
- package/src/data/providers/uniswap-v3.mjs +457 -0
- package/src/data/providers/uniswap-v4.mjs +414 -0
- package/src/data/providers/vertex.mjs +41 -0
- package/src/data/providers/wallet-watch.mjs +264 -0
- package/src/data/providers/wormhole.mjs +28 -0
- package/src/data/providers/yearn.mjs +31 -0
- package/src/data/providers/zerox.mjs +167 -0
- package/src/data/public-api-scan.mjs +61 -0
- package/src/data/quote-placeholder.mjs +31 -0
- package/src/desk/swap-prepare.mjs +194 -0
- package/src/equities/bridge.mjs +388 -0
- package/src/equities/fixtures/bridge_routes.json +159 -0
- package/src/equities/fixtures/dst_transitions.json +29 -0
- package/src/equities/fixtures/equity_dex_pools.json +154 -0
- package/src/equities/fixtures/hip3_l2books.json +2711 -0
- package/src/equities/fixtures/nyse_holidays.json +1 -0
- package/src/equities/fixtures/oracles.json +100 -0
- package/src/equities/fixtures/rh_pool_state.json +244 -0
- package/src/equities/fixtures/solana_xstocks.json +704 -0
- package/src/equities/fixtures/ton_xstocks.json +35 -0
- package/src/equities/fixtures/universe.json +411 -0
- package/src/equities/fixtures/venues.json +3542 -0
- package/src/equities/fixtures.mjs +405 -0
- package/src/equities/funding.mjs +142 -0
- package/src/equities/index.mjs +166 -0
- package/src/equities/liveness.mjs +148 -0
- package/src/equities/marketHours.mjs +249 -0
- package/src/equities/normalize.mjs +295 -0
- package/src/equities/num.mjs +146 -0
- package/src/equities/prepare.mjs +95 -0
- package/src/equities/rank.mjs +260 -0
- package/src/equities/sourceNum.mjs +69 -0
- package/src/equities/types.mjs +220 -0
- package/src/equities/venues/arcus-perp.mjs +84 -0
- package/src/equities/venues/arcus-spot.mjs +105 -0
- package/src/equities/venues/hyperliquid-hip3.mjs +224 -0
- package/src/equities/venues/rh-uniswap.mjs +216 -0
- package/src/equities/venues/solana-xstocks.mjs +139 -0
- package/src/equities/venues/ton-stonfi.mjs +139 -0
- package/src/exact-integer.mjs +72 -0
- package/src/exec-policy.mjs +419 -0
- package/src/flags.mjs +15 -0
- package/src/fresh-window.mjs +76 -0
- package/src/gmx-attestation.mjs +176 -0
- package/src/index.mjs +107 -0
- package/src/licensing/locals-only.mjs +25 -0
- package/src/nft-gas-war-guard.mjs +139 -0
- package/src/onboarding/agent-keys.mjs +161 -0
- package/src/onboarding/harness-configs.mjs +102 -0
- package/src/onboarding/index.mjs +18 -0
- package/src/onboarding/tiers.mjs +139 -0
- package/src/oracle-env.mjs +55 -0
- package/src/package-manifest.mjs +42 -0
- package/src/plugins/agent-plugin-loader.mjs +225 -0
- package/src/portfolio-risk.mjs +170 -0
- package/src/prepare-envelope.mjs +204 -0
- package/src/profile-upgrade.mjs +277 -0
- package/src/protocol-execution.mjs +84 -0
- package/src/protocol-templates/gate.mjs +179 -0
- package/src/protocol-templates/prepare-deploy.mjs +81 -0
- package/src/public-api/agent-grants.mjs +57 -0
- package/src/public-api/buzz-integration.mjs +267 -0
- package/src/public-api/connect-agent.mjs +424 -0
- package/src/public-api/grants.mjs +142 -0
- package/src/public-api/http.mjs +707 -0
- package/src/public-api/metering.mjs +111 -0
- package/src/public-control/aa-adapter.mjs +402 -0
- package/src/public-control/build-registry.mjs +227 -0
- package/src/public-control/bundler-client.mjs +357 -0
- package/src/public-control/grant-indexer.mjs +296 -0
- package/src/public-control/policy-render.mjs +69 -0
- package/src/public-control/policy-schema.mjs +322 -0
- package/src/public-control/runtime-config.mjs +275 -0
- package/src/public-control/session-key-model.mjs +379 -0
- package/src/public-control/session-orchestrator.mjs +418 -0
- package/src/rfq/intent.mjs +180 -0
- package/src/rfq/sources.mjs +181 -0
- package/src/route-attestation.mjs +132 -0
- package/src/router/best-execution.mjs +326 -0
- package/src/router/index.mjs +250 -0
- package/src/router/integrator-fee.mjs +135 -0
- package/src/router/prepare-bridge.mjs +293 -0
- package/src/router/prepare-route.mjs +398 -0
- package/src/router/proposal.mjs +311 -0
- package/src/router/risk-classifier.mjs +119 -0
- package/src/router/route-sources.mjs +364 -0
- package/src/scanner/chains.config.mjs +543 -0
- package/src/scanner/contract.mjs +270 -0
- package/src/scanner/evm-scanner.mjs +394 -0
- package/src/scanner/index.mjs +9 -0
- package/src/scanner/v2-venue.mjs +351 -0
- package/src/scanner/v3-venue.mjs +308 -0
- package/src/scopes.mjs +44 -0
- package/src/sell-simulation.mjs +167 -0
- package/src/signals/engine.mjs +146 -0
- package/src/signals/index.mjs +1 -0
- package/src/token-transfer-guard.mjs +188 -0
- package/src/tui/app.mjs +438 -0
- package/src/tui/backend.mjs +215 -0
- package/src/tui/format.mjs +272 -0
- package/src/tui/gateway-client.mjs +177 -0
- package/src/tui/input.mjs +501 -0
- package/src/tui/memory.mjs +105 -0
- package/src/tui/meta-learn.mjs +85 -0
- package/src/tui/renderer.mjs +443 -0
- package/src/tui/scheduler.mjs +205 -0
- package/src/tui/skills-loader.mjs +140 -0
- package/src/tui/standalone-client.mjs +752 -0
- package/src/tui/theme.mjs +81 -0
- package/src/vault-attestation.mjs +146 -0
- package/src/venues.mjs +206 -0
- package/src/watch-preferences.mjs +85 -0
|
@@ -0,0 +1,2073 @@
|
|
|
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=Archivo+Black&family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=DM+Sans:wght@500;700&family=IBM+Plex+Mono:wght@400;500&family=Inter:wght@500;650;750;850&family=UnifrakturCook:wght@700&family=Manrope:wght@600;800&family=Outfit:wght@300;400;500;700&family=Sora:wght@500;700&family=Space+Grotesk:wght@500;700&display=swap" rel="stylesheet" />
|
|
15
|
+
<style>
|
|
16
|
+
:root{
|
|
17
|
+
--bg:#06080B;
|
|
18
|
+
--panel:#0C1117;
|
|
19
|
+
--panel-2:#131A22;
|
|
20
|
+
--blue:#DEF8FF;
|
|
21
|
+
--blue2:#DEF8FF;
|
|
22
|
+
--blue-dim:#4E7C8C;
|
|
23
|
+
--ink:#FFFFFF;
|
|
24
|
+
--cool:#D7E4EE;
|
|
25
|
+
--mute:#8A9AA8;
|
|
26
|
+
--line:rgba(222,248,255,.13);
|
|
27
|
+
--line-2:rgba(222,248,255,.26);
|
|
28
|
+
--evm:#DEF8FF;
|
|
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
|
+
--max:1100px;
|
|
40
|
+
}
|
|
41
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
42
|
+
html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;overflow-x:clip;max-width:100%}
|
|
43
|
+
body{
|
|
44
|
+
min-height:100dvh;background:var(--bg);color:var(--ink);position:relative;isolation:isolate;
|
|
45
|
+
font-family:var(--sans);font-weight:400;overflow-x:clip;max-width:100vw;
|
|
46
|
+
}
|
|
47
|
+
::selection{background:var(--blue);color:#061018}
|
|
48
|
+
a{color:inherit;text-decoration:none}
|
|
49
|
+
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
|
|
50
|
+
img{display:inline-block}
|
|
51
|
+
|
|
52
|
+
.grain{
|
|
53
|
+
position:fixed;inset:0;z-index:40;pointer-events:none;opacity:.04;mix-blend-mode:soft-light;
|
|
54
|
+
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>");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* ── orbital oracle mark ───────────────────────────── */
|
|
58
|
+
.orbital{position:relative;display:inline-block}
|
|
59
|
+
.orbital svg{display:block;overflow:visible;width:100%;height:100%}
|
|
60
|
+
.orbital .ring{transform-origin:50% 50%;fill:none;stroke:var(--blue);stroke-width:2;opacity:.55}
|
|
61
|
+
.orbital .ring ellipse{vector-effect:non-scaling-stroke}
|
|
62
|
+
.orbital .r1{animation:orb-spin 13s linear infinite}
|
|
63
|
+
.orbital .r2{animation:orb-spin 21s linear infinite reverse;opacity:.4}
|
|
64
|
+
.orbital .r3{animation:orb-spin 32s linear infinite;opacity:.28}
|
|
65
|
+
.orbital .tickring{transform-origin:50% 50%;fill:none;stroke:rgba(184,240,255,.35);stroke-width:1.4;stroke-dasharray:2 7;animation:orb-spin 46s linear infinite reverse}
|
|
66
|
+
.orbital .core{fill:var(--blue);animation:core-pulse 3.2s var(--ease) infinite}
|
|
67
|
+
.orbital .halo{fill:none;stroke:rgba(184,240,255,.22);stroke-width:5;filter:blur(3px)}
|
|
68
|
+
@keyframes orb-spin{to{transform:rotate(360deg)}}
|
|
69
|
+
@keyframes core-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.06)}}
|
|
70
|
+
@keyframes core-billboard{from{transform:rotateY(0deg) rotateX(-18deg) rotateZ(8deg)}to{transform:rotateY(-360deg) rotateX(-18deg) rotateZ(8deg)}}
|
|
71
|
+
@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))}}
|
|
72
|
+
|
|
73
|
+
.loader{
|
|
74
|
+
position:fixed;inset:0;z-index:50;background:var(--bg);
|
|
75
|
+
display:grid;place-items:center;
|
|
76
|
+
transition:opacity .7s var(--ease),visibility .7s;
|
|
77
|
+
}
|
|
78
|
+
.loader.out{opacity:0;visibility:hidden;pointer-events:none}
|
|
79
|
+
.loader-inner{display:flex;flex-direction:column;align-items:center;gap:18px}
|
|
80
|
+
.loader-mark{width:64px;height:64px;filter:drop-shadow(0 0 18px rgba(184,240,255,.4))}
|
|
81
|
+
.loader-word{font-family:var(--display);font-size:18px;letter-spacing:.08em;text-transform:none;color:var(--cool);font-style:italic}
|
|
82
|
+
.loader-bar{width:120px;height:1px;background:rgba(184,240,255,.15);overflow:hidden}
|
|
83
|
+
.loader-bar span{display:block;height:100%;width:0;background:var(--blue);transition:width 1.1s var(--ease)}
|
|
84
|
+
|
|
85
|
+
.progress{
|
|
86
|
+
position:fixed;top:0;left:0;right:0;height:2px;z-index:35;pointer-events:none;
|
|
87
|
+
background:linear-gradient(90deg,var(--blue),var(--blue2));
|
|
88
|
+
transform-origin:0 50%;transform:scaleX(0);
|
|
89
|
+
box-shadow:0 0 12px rgba(184,240,255,.5);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.nav{
|
|
93
|
+
position:fixed;top:0;left:0;right:0;z-index:30;
|
|
94
|
+
display:grid;
|
|
95
|
+
grid-template-columns:1fr auto;
|
|
96
|
+
align-items:center;gap:16px;
|
|
97
|
+
padding:14px var(--pad);
|
|
98
|
+
background:rgba(6,8,11,.82);
|
|
99
|
+
border-bottom:1px solid var(--line);
|
|
100
|
+
}
|
|
101
|
+
.brand{
|
|
102
|
+
display:flex;align-items:center;gap:12px;
|
|
103
|
+
font-family:var(--display);font-size:24px;font-weight:400;letter-spacing:.02em;
|
|
104
|
+
text-transform:none;justify-self:start;
|
|
105
|
+
}
|
|
106
|
+
.brand .orbital{width:26px;height:26px;filter:drop-shadow(0 0 10px rgba(184,240,255,.6))}
|
|
107
|
+
.nav-links{
|
|
108
|
+
display:flex;align-items:center;gap:18px;justify-self:end;
|
|
109
|
+
font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--cool);
|
|
110
|
+
}
|
|
111
|
+
.nav-links a{opacity:.78;transition:opacity .25s,color .25s}
|
|
112
|
+
.nav-links a:hover{opacity:1;color:var(--blue2)}
|
|
113
|
+
.nav-chip{
|
|
114
|
+
font-family:var(--mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;
|
|
115
|
+
border:1px solid rgba(184,240,255,.3);border-radius:999px;padding:7px 11px;color:var(--blue2);opacity:.95;
|
|
116
|
+
}
|
|
117
|
+
.nav-cta{
|
|
118
|
+
border:1px solid rgba(184,240,255,.28);border-radius:999px;padding:10px 16px;color:var(--ink);
|
|
119
|
+
transition:border-color .3s,color .3s,box-shadow .3s;
|
|
120
|
+
}
|
|
121
|
+
.nav-cta:hover{border-color:var(--blue);color:var(--blue2);box-shadow:0 0 0 1px rgba(184,240,255,.12)}
|
|
122
|
+
|
|
123
|
+
/* fixed soft field behind content */
|
|
124
|
+
#gl{position:fixed;inset:0;width:100%;height:100%;z-index:-1;display:block;opacity:.4;pointer-events:none}
|
|
125
|
+
.veil{
|
|
126
|
+
position:fixed;inset:0;z-index:1;pointer-events:none;
|
|
127
|
+
background:
|
|
128
|
+
radial-gradient(60% 50% at 50% 28%, rgba(184,240,255,.10), transparent 58%),
|
|
129
|
+
linear-gradient(180deg, rgba(6,8,11,.12), rgba(6,8,11,.42));
|
|
130
|
+
}
|
|
131
|
+
main{position:relative;z-index:2;padding-top:84px}
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
/* homepage */
|
|
135
|
+
.home{
|
|
136
|
+
overflow-x:clip;
|
|
137
|
+
min-height:calc(100dvh - 84px);
|
|
138
|
+
padding-block:clamp(28px,6vh,72px);
|
|
139
|
+
display:grid;place-items:center;
|
|
140
|
+
padding:clamp(20px,4vh,44px) var(--pad) clamp(56px,9vh,96px);
|
|
141
|
+
position:relative;overflow:hidden;text-align:left;
|
|
142
|
+
}
|
|
143
|
+
.home::after{
|
|
144
|
+
content:"";position:absolute;left:50%;bottom:22px;width:1px;height:74px;
|
|
145
|
+
background:linear-gradient(180deg, rgba(184,240,255,.65), transparent);
|
|
146
|
+
transform-origin:50% 0;animation:drop-line 2.8s var(--ease) infinite;
|
|
147
|
+
}
|
|
148
|
+
.home-inner{max-width:min(1180px,100%);width:100%;margin:0 auto;position:relative}
|
|
149
|
+
.hero-primary{min-width:0;display:flex;flex-direction:column;align-items:center}
|
|
150
|
+
.home-kicker{
|
|
151
|
+
font-family:var(--mono);font-size:10px;letter-spacing:.34em;text-transform:uppercase;color:var(--blue);
|
|
152
|
+
margin-bottom:6px;position:relative;z-index:3;
|
|
153
|
+
}
|
|
154
|
+
.hero-stage{position:relative;width:100%;display:grid;place-items:center;min-height:clamp(360px,52vh,560px)}
|
|
155
|
+
.hero-art{position:absolute;inset:0;display:grid;place-items:center;z-index:0;pointer-events:none;overflow:clip}
|
|
156
|
+
.hero-orb{
|
|
157
|
+
width:clamp(380px,50vw,640px);aspect-ratio:1;position:relative;transform-style:preserve-3d;
|
|
158
|
+
animation:orb-slew 22s linear infinite;
|
|
159
|
+
}
|
|
160
|
+
.hero-orb .lat{position:absolute;inset:0;border-radius:50%;border:1.2px solid rgba(184,240,255,.42);transform-style:preserve-3d;box-shadow:0 0 26px rgba(184,240,255,.1), inset 0 0 34px rgba(184,240,255,.07)}
|
|
161
|
+
.hero-orb .lat.l1{transform:rotateY(0deg);border-color:rgba(222,248,255,.62)}
|
|
162
|
+
.hero-orb .lat.l2{transform:rotateY(45deg)}
|
|
163
|
+
.hero-orb .lat.l3{transform:rotateY(90deg);border-color:rgba(222,248,255,.58)}
|
|
164
|
+
.hero-orb .lat.l4{transform:rotateY(135deg)}
|
|
165
|
+
.hero-orb .par{position:absolute;left:50%;top:50%;border-radius:50%;border:1px solid rgba(184,240,255,.3);transform-style:preserve-3d;box-shadow:inset 0 0 24px rgba(184,240,255,.06)}
|
|
166
|
+
.hero-orb .par.p1{width:96%;height:96%;transform:translate(-50%,-50%) rotateX(90deg)}
|
|
167
|
+
.hero-orb .par.p2{width:78%;height:78%;transform:translate(-50%,-50%) rotateX(90deg) translateZ(calc(clamp(380px,50vw,640px) * .31))}
|
|
168
|
+
.hero-orb .par.p3{width:78%;height:78%;transform:translate(-50%,-50%) rotateX(90deg) translateZ(calc(clamp(380px,50vw,640px) * -.31))}
|
|
169
|
+
.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(184,240,255,.4), inset 0 0 30px rgba(222,248,255,.14)}
|
|
170
|
+
.hero-orb .core-glow{
|
|
171
|
+
position:absolute;inset:38%;border-radius:50%;
|
|
172
|
+
transform:rotateZ(8deg) rotateX(-18deg);
|
|
173
|
+
animation:core-billboard 22s linear infinite;
|
|
174
|
+
background:
|
|
175
|
+
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%);
|
|
176
|
+
box-shadow:
|
|
177
|
+
inset -12px -15px 34px rgba(6,16,32,.5),
|
|
178
|
+
inset 8px 10px 26px rgba(210,238,255,.2),
|
|
179
|
+
0 0 60px rgba(184,240,255,.5),
|
|
180
|
+
0 0 140px rgba(184,240,255,.2);
|
|
181
|
+
}
|
|
182
|
+
.hero-orb .core-glow::before{
|
|
183
|
+
content:"";position:absolute;left:22%;top:16%;width:26%;height:20%;border-radius:50%;
|
|
184
|
+
background:radial-gradient(ellipse at 50% 50%, rgba(255,255,255,.9), rgba(255,255,255,.28) 44%, transparent 74%);
|
|
185
|
+
transform:rotate(-24deg);
|
|
186
|
+
}
|
|
187
|
+
.hero-orb .core-glow::after{
|
|
188
|
+
content:"";position:absolute;inset:-6%;border-radius:50%;pointer-events:none;
|
|
189
|
+
background:radial-gradient(circle at 50% 50%, rgba(184,240,255,.3) 0%, rgba(184,240,255,.09) 46%, transparent 68%);
|
|
190
|
+
animation:core-pulse 3.4s var(--ease) infinite;
|
|
191
|
+
}
|
|
192
|
+
.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(184,240,255,.5));box-shadow:0 0 22px rgba(222,248,255,.95), 0 0 44px rgba(184,240,255,.4);left:calc(50% - 4.5px);top:calc(50% - 4.5px);transform-style:preserve-3d;animation:orbit-travel 14s linear infinite}
|
|
193
|
+
.home-title{
|
|
194
|
+
position:relative;z-index:2;
|
|
195
|
+
font-family:var(--display);font-weight:300;font-size:clamp(72px,10vw,150px);line-height:.9;letter-spacing:-.045em;
|
|
196
|
+
text-transform:uppercase;color:var(--ink);
|
|
197
|
+
text-shadow:0 2px 30px rgba(0,0,0,.6);
|
|
198
|
+
}
|
|
199
|
+
.home-title em{font-style:italic;color:var(--blue2)}
|
|
200
|
+
.home-copy{position:relative;z-index:3;display:flex;flex-direction:column;align-items:center}
|
|
201
|
+
.home-copy p:not(.home-kicker){max-width:56ch;color:#aac0d6;font-size:16px;line-height:1.7;margin:18px 0 0;text-shadow:0 1px 20px rgba(0,0,0,.65)}
|
|
202
|
+
.home-actions{display:flex;flex-wrap:wrap;gap:14px;margin-top:26px;align-items:center;justify-content:center}
|
|
203
|
+
.enter-cta{
|
|
204
|
+
display:inline-flex;align-items:center;gap:12px;border:1px solid rgba(184,240,255,.45);border-radius:999px;
|
|
205
|
+
padding:14px 22px;color:var(--ink);font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;
|
|
206
|
+
background:linear-gradient(180deg, rgba(184,240,255,.12), rgba(184,240,255,.035));
|
|
207
|
+
box-shadow:0 0 0 1px rgba(184,240,255,.08),0 20px 46px rgba(0,0,0,.3);
|
|
208
|
+
transition:transform .35s var(--ease),border-color .35s,box-shadow .35s;
|
|
209
|
+
}
|
|
210
|
+
.enter-cta::after{content:"↓";font-size:13px;color:var(--blue)}
|
|
211
|
+
.enter-cta:hover{transform:translateY(-2px);border-color:var(--blue);box-shadow:0 0 0 1px rgba(184,240,255,.18),0 24px 58px rgba(0,0,0,.36)}
|
|
212
|
+
.hero-note{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
|
|
213
|
+
@keyframes orb-slew{0%{transform:rotateX(18deg) rotateZ(-8deg) rotateY(0deg)}100%{transform:rotateX(18deg) rotateZ(-8deg) rotateY(360deg)}}
|
|
214
|
+
@keyframes home-breathe{0%,100%{opacity:.65;transform:scale(1)}50%{opacity:1;transform:scale(1.07)}}
|
|
215
|
+
@keyframes drop-line{0%,100%{opacity:.25;transform:translateX(-50%) scaleY(.45)}50%{opacity:1;transform:translateX(-50%) scaleY(1)}}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
.section{
|
|
219
|
+
position:relative;z-index:2;max-width:var(--max);margin:0 auto;
|
|
220
|
+
padding:clamp(56px,10vh,110px) var(--pad) 0;
|
|
221
|
+
}
|
|
222
|
+
.section:first-of-type{padding-top:clamp(18px,3vh,28px)}
|
|
223
|
+
.section-label{
|
|
224
|
+
font-family:var(--mono);font-size:10px;letter-spacing:.34em;text-transform:uppercase;color:var(--blue);margin-bottom:14px;
|
|
225
|
+
display:inline-flex;align-items:center;gap:12px;
|
|
226
|
+
}
|
|
227
|
+
.section-title{
|
|
228
|
+
font-family:var(--display);font-weight:400;
|
|
229
|
+
font-size:clamp(34px,5vw,54px);line-height:1.06;letter-spacing:-.01em;
|
|
230
|
+
max-width:18ch;margin-bottom:12px;
|
|
231
|
+
}
|
|
232
|
+
.section-title em{font-style:italic;color:var(--blue2)}
|
|
233
|
+
.section-lede{max-width:52ch;color:#C9DAEC;font-size:16px;line-height:1.7;margin-bottom:clamp(28px,4vw,44px)}
|
|
234
|
+
|
|
235
|
+
/* orchestration graph */
|
|
236
|
+
.graph-shell{
|
|
237
|
+
border:1px solid var(--line);border-radius:20px;overflow:hidden;
|
|
238
|
+
background:linear-gradient(180deg, rgba(184,240,255,.04), transparent 42%), var(--panel);
|
|
239
|
+
}
|
|
240
|
+
.graph-top{
|
|
241
|
+
display:flex;flex-wrap:wrap;justify-content:center;gap:10px;
|
|
242
|
+
padding:14px 18px;border-bottom:1px solid var(--line);
|
|
243
|
+
font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:#9FB8D2;
|
|
244
|
+
}
|
|
245
|
+
.graph-top b{color:var(--blue);font-weight:500}
|
|
246
|
+
.graph-canvas{padding:clamp(28px,4vw,40px) clamp(14px,2.5vw,24px) clamp(22px,3vw,30px);overflow:auto}
|
|
247
|
+
.orch{width:min(1100px,100%);margin:0 auto;min-width:720px}
|
|
248
|
+
.row{display:flex;justify-content:center;gap:14px;align-items:stretch}
|
|
249
|
+
.row.profiles{
|
|
250
|
+
display:grid;
|
|
251
|
+
grid-template-columns:repeat(2,minmax(0,1fr));
|
|
252
|
+
gap:10px;width:100%;
|
|
253
|
+
}
|
|
254
|
+
@media (min-width:900px){
|
|
255
|
+
.row.profiles{grid-template-columns:repeat(3,minmax(0,1fr))}
|
|
256
|
+
}
|
|
257
|
+
@media (min-width:1180px){
|
|
258
|
+
.row.profiles{grid-template-columns:repeat(4,minmax(0,1fr))}
|
|
259
|
+
}
|
|
260
|
+
.route-strip{
|
|
261
|
+
display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
|
|
262
|
+
gap:1px;background:var(--line);border-top:1px solid var(--line);
|
|
263
|
+
}
|
|
264
|
+
@media (min-width:1100px){
|
|
265
|
+
.route-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
|
|
266
|
+
}
|
|
267
|
+
.node{
|
|
268
|
+
border:1px solid rgba(184,240,255,.42);border-radius:14px;background:rgba(21,32,49,.92);
|
|
269
|
+
padding:14px 12px;text-align:center;
|
|
270
|
+
transition:border-color .4s var(--ease),transform .4s var(--ease),box-shadow .4s var(--ease);
|
|
271
|
+
}
|
|
272
|
+
.node:hover{transform:translate3d(0,-3px,0);box-shadow:0 14px 34px rgba(0,0,0,.32)}
|
|
273
|
+
.node.hub{
|
|
274
|
+
width:min(300px,100%);
|
|
275
|
+
border-color:rgba(184,240,255,.5);
|
|
276
|
+
background:linear-gradient(180deg, rgba(184,240,255,.12), rgba(6,8,11,.88));
|
|
277
|
+
box-shadow:0 0 0 1px rgba(184,240,255,.08), 0 16px 40px rgba(0,0,0,.3);
|
|
278
|
+
padding:18px 16px 20px;
|
|
279
|
+
display:flex;flex-direction:column;align-items:center;
|
|
280
|
+
}
|
|
281
|
+
.node.hub .orbital{width:74px;height:74px;margin:2px 0 10px;filter:drop-shadow(0 0 20px rgba(184,240,255,.35))}
|
|
282
|
+
.node .tag{font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:#9FB8D2;margin-bottom:8px}
|
|
283
|
+
.node.hub .tag{color:var(--blue)}
|
|
284
|
+
.node .name{font-family:var(--display);font-size:22px;font-weight:500;color:#DCEAF6;line-height:1;letter-spacing:.01em;margin-bottom:6px}
|
|
285
|
+
.node.hub .name{font-size:34px;font-weight:400;font-style:italic}
|
|
286
|
+
.node .sub{font-family:var(--mono);font-size:11px;letter-spacing:.05em;color:#C9DAEC;line-height:1.5}
|
|
287
|
+
.node.route{min-height:138px;display:flex;flex-direction:column;justify-content:flex-start;text-align:left;padding:14px}
|
|
288
|
+
.node.route .name{font-size:18px;margin-bottom:8px}
|
|
289
|
+
.node.route .chains{
|
|
290
|
+
margin-top:auto;padding-top:10px;
|
|
291
|
+
font-family:var(--mono);font-size:10px;letter-spacing:.04em;line-height:1.7;
|
|
292
|
+
display:flex;flex-wrap:wrap;gap:4px 10px;align-items:center;
|
|
293
|
+
}
|
|
294
|
+
.ch-add{border:1px dashed color-mix(in oklab,var(--blue) 42%,transparent);border-radius:999px;padding:1px 7px;color:var(--blue);opacity:.92}
|
|
295
|
+
.ch{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
|
|
296
|
+
.ch img{width:13px;height:13px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
|
|
297
|
+
.node.add{
|
|
298
|
+
border-style:dashed;border-color:rgba(184,240,255,.28);
|
|
299
|
+
background:rgba(6,8,11,.35);
|
|
300
|
+
min-height:138px;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;
|
|
301
|
+
text-align:left;padding:14px;
|
|
302
|
+
}
|
|
303
|
+
.node.add .name{font-size:18px;color:var(--blue2)}
|
|
304
|
+
.node.add .sub{color:var(--mute)}
|
|
305
|
+
.node.add:hover{border-color:rgba(184,240,255,.55);background:rgba(184,240,255,.06)}
|
|
306
|
+
|
|
307
|
+
.builder-row{margin-top:0;display:flex;justify-content:center}
|
|
308
|
+
.node.builder-sink{width:min(430px,100%);text-align:center;align-items:center;min-height:162px;position:relative}
|
|
309
|
+
.node.builder-sink .name{font-size:26px}
|
|
310
|
+
.node.builder-sink .chains{justify-content:center}
|
|
311
|
+
.wires.funnel{height:62px}
|
|
312
|
+
.wires.funnel path{stroke:rgba(255,176,137,.48)}
|
|
313
|
+
.wires.funnel path:nth-child(2n){stroke:rgba(184,240,255,.32)}
|
|
314
|
+
.wires.funnel circle{fill:#ffb089}
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
/* protocol colors */
|
|
318
|
+
.node.p-hl{border-color:rgba(80,210,193,.45);background:linear-gradient(180deg, rgba(80,210,193,.14), rgba(6,8,11,.88))}
|
|
319
|
+
.node.p-hl .tag,.node.p-hl .name{color:var(--hl)}
|
|
320
|
+
.node.p-hl .chains{color:rgba(80,210,193,.9)}
|
|
321
|
+
.node.p-hl:hover{border-color:var(--hl);box-shadow:0 12px 30px rgba(80,210,193,.12)}
|
|
322
|
+
|
|
323
|
+
.node.p-rh{border-color:rgba(215,255,77,.55);background:linear-gradient(180deg, rgba(215,255,77,.14), rgba(6,8,11,.88))}
|
|
324
|
+
.node.p-rh .tag,.node.p-rh .name{color:var(--rh)}
|
|
325
|
+
.node.p-rh .chains{color:rgba(215,255,77,.92)}
|
|
326
|
+
.node.p-rh:hover{border-color:var(--rh);box-shadow:0 12px 30px rgba(215,255,77,.16)}
|
|
327
|
+
|
|
328
|
+
.node.p-sol{border-color:rgba(153,69,255,.5);background:linear-gradient(180deg, rgba(153,69,255,.14), rgba(6,8,11,.88))}
|
|
329
|
+
.node.p-sol .tag,.node.p-sol .name{color:#c4a0ff}
|
|
330
|
+
.node.p-sol .chains{color:rgba(196,160,255,.9)}
|
|
331
|
+
.node.p-sol:hover{border-color:var(--sol);box-shadow:0 12px 30px rgba(153,69,255,.14)}
|
|
332
|
+
|
|
333
|
+
.node.p-poly{border-color:rgba(59,130,246,.5);background:linear-gradient(180deg, rgba(59,130,246,.14), rgba(6,8,11,.88))}
|
|
334
|
+
.node.p-poly .tag,.node.p-poly .name{color:#93c5fd}
|
|
335
|
+
.node.p-poly .chains{color:rgba(147,197,253,.9)}
|
|
336
|
+
.node.p-poly:hover{border-color:var(--poly);box-shadow:0 12px 30px rgba(59,130,246,.14)}
|
|
337
|
+
|
|
338
|
+
.node.p-stable{border-color:rgba(240,185,11,.5);background:linear-gradient(180deg, rgba(240,185,11,.12), rgba(6,8,11,.88))}
|
|
339
|
+
.node.p-build{border-color:rgba(255,140,90,.55);background:linear-gradient(180deg, rgba(255,140,90,.14), rgba(6,8,11,.88))}
|
|
340
|
+
.node.p-build .tag,.node.p-build .name{color:#ffb089}
|
|
341
|
+
.node.p-build .chains{color:rgba(255,176,137,.92)}
|
|
342
|
+
.node.p-build:hover{border-color:#ff8c5a;box-shadow:0 12px 30px rgba(255,140,90,.14)}
|
|
343
|
+
.route-card.p-build .where{color:#ffb089}
|
|
344
|
+
.route-card.p-build{box-shadow:inset 3px 0 0 #ff8c5a}
|
|
345
|
+
.node.p-stable .tag,.node.p-stable .name{color:#fcd34d}
|
|
346
|
+
.node.p-stable .chains{color:rgba(252,211,77,.9)}
|
|
347
|
+
.node.p-stable:hover{border-color:var(--stable);box-shadow:0 12px 30px rgba(240,185,11,.12)}
|
|
348
|
+
|
|
349
|
+
.route-card.p-hl .where{color:var(--hl)}
|
|
350
|
+
.route-card.p-rh .where{color:var(--rh)}
|
|
351
|
+
.route-card.p-sol .where{color:#c4a0ff}
|
|
352
|
+
.route-card.p-poly .where{color:#93c5fd}
|
|
353
|
+
.route-card.p-stable .where{color:#fcd34d}
|
|
354
|
+
.route-card.p-add .where{color:var(--blue2)}
|
|
355
|
+
.route-card.p-hl{box-shadow:inset 3px 0 0 var(--hl)}
|
|
356
|
+
.route-card.p-rh{box-shadow:inset 3px 0 0 var(--rh)}
|
|
357
|
+
.route-card.p-sol{box-shadow:inset 3px 0 0 var(--sol)}
|
|
358
|
+
.route-card.p-poly{box-shadow:inset 3px 0 0 var(--poly)}
|
|
359
|
+
.route-card.p-stable{box-shadow:inset 3px 0 0 var(--stable)}
|
|
360
|
+
.route-card.p-add{box-shadow:inset 3px 0 0 rgba(184,240,255,.45);opacity:.92}
|
|
361
|
+
|
|
362
|
+
.node.p-btc{border-color:rgba(247,147,26,.55);background:linear-gradient(180deg, rgba(247,147,26,.14), rgba(6,8,11,.88))}
|
|
363
|
+
.node.p-btc .tag,.node.p-btc .name{color:#fbbf24}
|
|
364
|
+
.node.p-btc .chains{color:rgba(251,191,36,.92)}
|
|
365
|
+
.node.p-btc:hover{border-color:#f7931a;box-shadow:0 12px 30px rgba(247,147,26,.14)}
|
|
366
|
+
.route-card.p-btc .where{color:#fbbf24}
|
|
367
|
+
.route-card.p-btc{box-shadow:inset 3px 0 0 #f7931a}
|
|
368
|
+
|
|
369
|
+
.node.p-evm{border-color:rgba(98,126,234,.5);background:linear-gradient(180deg, rgba(98,126,234,.14), rgba(6,8,11,.88))}
|
|
370
|
+
.node.p-evm .tag,.node.p-evm .name{color:#a5b4fc}
|
|
371
|
+
.node.p-evm .chains{color:rgba(165,180,252,.92)}
|
|
372
|
+
.node.p-evm:hover{border-color:#627eea;box-shadow:0 12px 30px rgba(98,126,234,.14)}
|
|
373
|
+
.route-card.p-evm .where{color:#a5b4fc}
|
|
374
|
+
.route-card.p-evm{box-shadow:inset 3px 0 0 #627eea}
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
.moat-grid{
|
|
378
|
+
display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
|
|
379
|
+
gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden;
|
|
380
|
+
margin-top:22px;
|
|
381
|
+
}
|
|
382
|
+
.moat-card{
|
|
383
|
+
background:rgba(12,17,23,.94);padding:clamp(20px,3vw,28px);min-height:140px;
|
|
384
|
+
display:flex;flex-direction:column;gap:10px;
|
|
385
|
+
transition:background .35s;
|
|
386
|
+
}
|
|
387
|
+
.moat-card:hover{background:var(--panel-2)}
|
|
388
|
+
.moat-card .n{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
|
|
389
|
+
.moat-card h3{font-family:var(--display);font-weight:400;font-size:clamp(20px,2.2vw,26px)}
|
|
390
|
+
.moat-card p{color:#C9DAEC;font-size:15px;line-height:1.55;max-width:44ch}
|
|
391
|
+
@media (max-width:860px){.moat-grid{grid-template-columns:1fr}}
|
|
392
|
+
|
|
393
|
+
.strategy-surface{
|
|
394
|
+
margin-top:clamp(30px,5vw,52px);border:1px solid var(--line);border-radius:20px;overflow:hidden;
|
|
395
|
+
background:linear-gradient(145deg,rgba(184,240,255,.07),rgba(12,17,23,.92) 40%,rgba(6,8,11,.98));
|
|
396
|
+
}
|
|
397
|
+
.strategy-head{display:flex;align-items:end;justify-content:space-between;gap:20px;padding:clamp(22px,3vw,34px);border-bottom:1px solid var(--line)}
|
|
398
|
+
.strategy-kicker{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
|
|
399
|
+
.strategy-head h3{font-family:var(--display);font-weight:400;font-size:clamp(28px,4vw,42px);line-height:1.05;margin-top:8px}
|
|
400
|
+
.strategy-head p{max-width:50ch;color:#C9DAEC;font-size:14px;line-height:1.6}
|
|
401
|
+
.strategy-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:1px;background:var(--line)}
|
|
402
|
+
.strategy-card{min-height:205px;padding:clamp(20px,2.6vw,28px);background:rgba(6,8,11,.96);display:flex;flex-direction:column;gap:11px}
|
|
403
|
+
.strategy-card .mode{font-family:var(--mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:var(--blue2)}
|
|
404
|
+
.strategy-card h4{font-family:var(--display);font-weight:400;font-size:clamp(23px,2.5vw,30px)}
|
|
405
|
+
.strategy-card p{color:#C9DAEC;font-size:14px;line-height:1.6}
|
|
406
|
+
.strategy-posture{padding:14px clamp(20px,3vw,34px);border-top:1px solid var(--line);font-family:var(--mono);font-size:9px;line-height:1.6;letter-spacing:.11em;text-transform:uppercase;color:var(--mute)}
|
|
407
|
+
.strategy-posture b{color:var(--blue2);font-weight:500}
|
|
408
|
+
@media (max-width:1180px){.strategy-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
|
|
409
|
+
@media (max-width:980px){.strategy-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.strategy-head{align-items:start;flex-direction:column}}
|
|
410
|
+
@media (max-width:620px){.strategy-grid{grid-template-columns:1fr}.strategy-card{min-height:0}}
|
|
411
|
+
|
|
412
|
+
/* actual Oracle CLI */
|
|
413
|
+
.convert-grid{display:grid;grid-template-columns:1fr;gap:clamp(18px,3vw,28px);align-items:stretch;margin-top:8px}
|
|
414
|
+
.convert-copy{display:flex;flex-direction:column;gap:14px;text-align:left;max-width:780px}
|
|
415
|
+
.convert-copy h3{font-family:var(--display);font-weight:400;font-size:clamp(26px,3vw,34px);line-height:1.1}
|
|
416
|
+
.convert-copy p{color:#C9DAEC;font-size:15px;line-height:1.65;max-width:54ch}
|
|
417
|
+
.convert-pills{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}
|
|
418
|
+
.convert-pills span{font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;border:1px solid rgba(184,240,255,.28);border-radius:999px;padding:8px 12px;color:var(--blue2)}
|
|
419
|
+
.platform-beta{display:inline-flex;align-items:center;gap:10px;width:max-content;max-width:100%;font-family:var(--mono);font-size:11px;letter-spacing:.08em;color:var(--cool)}
|
|
420
|
+
.platform-beta b{font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:#071018;background:var(--blue2);border-radius:999px;padding:5px 8px}
|
|
421
|
+
.cli-install{margin:0 0 22px;display:flex;flex-direction:column;gap:12px;align-items:flex-start}
|
|
422
|
+
.cli-install-cmd{padding:16px 20px;border-radius:12px;border:1px solid rgba(184,240,255,.34);background:rgba(12,17,23,.9);max-width:100%;overflow-x:auto}
|
|
423
|
+
.cli-install-cmd code{font-family:var(--mono);font-size:15px;letter-spacing:.02em;color:var(--blue2);white-space:nowrap}
|
|
424
|
+
.cli-install-gate{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--cool);margin:0;max-width:62ch;line-height:1.7}
|
|
425
|
+
.cli-install-gate b{font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:#071018;background:var(--blue2);border-radius:999px;padding:5px 8px;white-space:nowrap}
|
|
426
|
+
.cli-install-gate a{color:var(--blue2);text-decoration:underline;text-underline-offset:3px}
|
|
427
|
+
.cli-frame{border:1px solid var(--line);border-radius:16px;overflow:hidden;background:#0d1420;box-shadow:0 24px 60px rgba(0,0,0,.35)}
|
|
428
|
+
.cli-frame img{display:block;width:100%;height:auto}
|
|
429
|
+
.cli-cap{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);margin-top:10px;text-align:left}
|
|
430
|
+
.cli-code{margin-top:14px;padding:14px 16px;border-radius:12px;border:1px solid var(--line);background:rgba(12,17,23,.9);font-family:var(--mono);font-size:12px;line-height:1.55;color:var(--cool);overflow-x:auto;text-align:left}
|
|
431
|
+
.cli-code b{color:var(--blue2);font-weight:500}
|
|
432
|
+
|
|
433
|
+
.evolve-rail{
|
|
434
|
+
display:flex;flex-wrap:wrap;gap:8px;justify-content:center;
|
|
435
|
+
padding:14px 16px 4px;
|
|
436
|
+
}
|
|
437
|
+
.evolve-pill{
|
|
438
|
+
font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;
|
|
439
|
+
border:1px solid var(--line);border-radius:999px;padding:8px 12px;color:var(--cool);
|
|
440
|
+
}
|
|
441
|
+
.evolve-pill.on{border-color:rgba(184,240,255,.35);color:var(--blue2)}
|
|
442
|
+
|
|
443
|
+
.wires{height:40px;position:relative}
|
|
444
|
+
.wires svg{width:100%;height:100%;display:block;overflow:visible}
|
|
445
|
+
.wires path{
|
|
446
|
+
fill:none;stroke:rgba(184,240,255,.58);stroke-width:1.5;stroke-linecap:round;
|
|
447
|
+
stroke-dasharray:1;stroke-dashoffset:1;
|
|
448
|
+
transition:stroke-dashoffset 1.3s var(--ease);
|
|
449
|
+
}
|
|
450
|
+
.wires.in path{stroke-dashoffset:0}
|
|
451
|
+
.wires path.w-2{transition-delay:.12s}
|
|
452
|
+
.wires path.w-3{transition-delay:.2s}
|
|
453
|
+
.wires path.w-4{transition-delay:.28s}
|
|
454
|
+
.wires path.w-5{transition-delay:.36s}
|
|
455
|
+
.wires circle{fill:var(--blue);opacity:0;transition:opacity .5s var(--ease) .7s}
|
|
456
|
+
.wires.in circle{opacity:1}
|
|
457
|
+
.wires.multi path.w-poly{stroke:rgba(59,130,246,.55)}
|
|
458
|
+
.wires.multi path.w-hl{stroke:rgba(80,210,193,.55)}
|
|
459
|
+
.wires.multi path.w-rh{stroke:rgba(215,255,77,.6)}
|
|
460
|
+
.wires.multi path.w-sol{stroke:rgba(153,69,255,.55)}
|
|
461
|
+
.wires.multi circle.c-poly{fill:var(--poly)}
|
|
462
|
+
.wires.multi circle.c-hl{fill:var(--hl)}
|
|
463
|
+
.wires.multi circle.c-rh{fill:var(--rh)}
|
|
464
|
+
.wires.multi circle.c-sol{fill:var(--sol)}
|
|
465
|
+
|
|
466
|
+
/* route detail cards */
|
|
467
|
+
.route-card{background:rgba(12,17,23,.94);
|
|
468
|
+
background:var(--bg);padding:22px 20px;min-height:150px;
|
|
469
|
+
display:flex;flex-direction:column;gap:10px;transition:background .35s;
|
|
470
|
+
}
|
|
471
|
+
.route-card:hover{background:var(--panel-2)}
|
|
472
|
+
.route-card h3{font-family:var(--display);font-weight:400;font-size:26px;display:flex;align-items:center;gap:10px}
|
|
473
|
+
.route-card h3 img{width:20px;height:20px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
|
|
474
|
+
.route-card .where{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--blue)}
|
|
475
|
+
.route-card p{color:#C9DAEC;font-size:15px;line-height:1.55}
|
|
476
|
+
.route-card .chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto}
|
|
477
|
+
.route-card.p-add{grid-column:1/-1;align-items:center;text-align:center;justify-content:center;gap:14px;padding:30px 22px}
|
|
478
|
+
.route-card.p-add .chips{justify-content:center;margin-top:4px}
|
|
479
|
+
.route-card.p-add p{max-width:46ch}
|
|
480
|
+
.chip-s{
|
|
481
|
+
font-family:var(--mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;
|
|
482
|
+
border:1px solid var(--line);border-radius:999px;padding:5px 8px;color:var(--cool);
|
|
483
|
+
}
|
|
484
|
+
.band-head{max-width:var(--max);margin:96px auto 0;padding:0 var(--pad)}
|
|
485
|
+
.band-head .eyebrow{font-family:var(--mono);font-size:10px;letter-spacing:3.4px;text-transform:uppercase;color:var(--mute);margin-bottom:10px}
|
|
486
|
+
.band-head h2{font-family:var(--display);font-weight:400;font-size:clamp(30px,3.4vw,50px);line-height:1.06;letter-spacing:-.01em}
|
|
487
|
+
@media (max-width:760px){.band-head{margin-top:60px}}
|
|
488
|
+
.why-band{
|
|
489
|
+
border-top:1px solid var(--line);
|
|
490
|
+
padding:22px 24px 24px;
|
|
491
|
+
background:rgba(6,8,11,.55);
|
|
492
|
+
}
|
|
493
|
+
.why-band p{
|
|
494
|
+
max-width:62ch;margin:0 auto;text-align:center;
|
|
495
|
+
font-family:var(--display);font-style:italic;font-weight:400;
|
|
496
|
+
font-size:clamp(18px,2.2vw,24px);line-height:1.4;color:var(--blue2);
|
|
497
|
+
}
|
|
498
|
+
.why-band span{
|
|
499
|
+
display:block;margin-top:10px;
|
|
500
|
+
font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);font-style:normal;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/* chains */
|
|
504
|
+
.proto-tiers{display:flex;flex-direction:column;gap:0;margin-top:8px}
|
|
505
|
+
.ptier{display:grid;grid-template-columns:minmax(0,.38fr) minmax(0,.62fr);gap:40px;
|
|
506
|
+
padding:34px 0;border-top:1px solid var(--line)}
|
|
507
|
+
.ptier:last-child{border-bottom:1px solid var(--line)}
|
|
508
|
+
.ptier-h{display:flex;flex-direction:column;gap:8px}
|
|
509
|
+
.ptier-h h3{font-family:var(--display);font-weight:400;font-size:clamp(30px,3.6vw,46px);
|
|
510
|
+
line-height:1.02;letter-spacing:-.012em;margin:0;color:var(--ink)}
|
|
511
|
+
.ptier-h p{margin:0;color:var(--dim);font-size:14px;max-width:34ch;line-height:1.5}
|
|
512
|
+
.ptier-n{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;
|
|
513
|
+
color:var(--blue2)}
|
|
514
|
+
.ptier-logos{display:flex;flex-wrap:wrap;gap:8px;align-content:flex-start}
|
|
515
|
+
.plogo{display:inline-flex;align-items:center;gap:8px;padding:8px 13px;border-radius:999px;
|
|
516
|
+
border:1px solid var(--line);background:rgba(255,255,255,.014);
|
|
517
|
+
font-size:12.5px;color:#C9DCEB;text-decoration:none;line-height:1;white-space:nowrap;
|
|
518
|
+
transition:border-color .45s var(--ease),color .45s var(--ease),background .45s var(--ease)}
|
|
519
|
+
.plogo:hover{border-color:color-mix(in oklab,var(--blue) 38%,transparent);color:var(--ink);
|
|
520
|
+
background:rgba(222,248,255,.05)}
|
|
521
|
+
.plogo img{height:15px;width:auto;max-width:76px;object-fit:contain;
|
|
522
|
+
filter:grayscale(1) brightness(1.7);opacity:.82}
|
|
523
|
+
.plogo:hover img{filter:none;opacity:1}
|
|
524
|
+
@media (max-width:860px){.ptier{grid-template-columns:1fr;gap:18px;padding:28px 0}}
|
|
525
|
+
.chain-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
|
|
526
|
+
.chain{transition:border-color .5s var(--ease),transform .5s var(--ease),background .5s var(--ease)}
|
|
527
|
+
.chain:hover{transform:translateY(-2px);border-color:color-mix(in oklab,var(--blue) 34%,transparent)}
|
|
528
|
+
.chain .badge{font-variant-numeric:tabular-nums;letter-spacing:.1em}
|
|
529
|
+
.chain .badge:not(.live){opacity:.62;border-style:dashed}
|
|
530
|
+
.hl-surface{margin-top:34px;border:1px solid var(--line);border-radius:14px;padding:20px;background:rgba(184,240,255,.02)}
|
|
531
|
+
.hl-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:16px}
|
|
532
|
+
.hl-grid article{border:1px solid rgba(184,240,255,.22);border-radius:10px;padding:16px 17px;background:rgba(12,17,23,.92)}
|
|
533
|
+
.hl-grid h3{font-family:var(--display);font-size:15px;font-weight:500;color:var(--ink);margin:0 0 6px}
|
|
534
|
+
.hl-grid p{font-size:14px;line-height:1.6;color:#C9DAEC;margin:0}
|
|
535
|
+
.hl-note{margin:16px 0 0;font-family:var(--mono);font-size:10.5px;letter-spacing:.04em;color:var(--cool);opacity:.62}
|
|
536
|
+
.hip3{margin-top:20px;padding-top:18px;border-top:1px solid var(--line)}
|
|
537
|
+
.hl-note code{font-family:var(--mono);color:var(--blue2);opacity:.9}
|
|
538
|
+
@media(max-width:900px){.hl-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
|
|
539
|
+
@media(max-width:620px){.hl-grid{grid-template-columns:1fr}}
|
|
540
|
+
.chain{
|
|
541
|
+
border:1px solid var(--line);border-radius:14px;padding:16px;
|
|
542
|
+
background:linear-gradient(180deg, rgba(184,240,255,.06), transparent 55%), rgba(12,17,23,.94);
|
|
543
|
+
min-height:100px;display:flex;flex-direction:column;justify-content:space-between;gap:12px;
|
|
544
|
+
transition:border-color .4s var(--ease),transform .4s var(--ease),box-shadow .4s var(--ease);
|
|
545
|
+
}
|
|
546
|
+
.chain:hover{border-color:rgba(184,240,255,.45);transform:translate3d(0,-3px,0)}
|
|
547
|
+
.chain-top{display:flex;justify-content:space-between;gap:8px;align-items:flex-start}
|
|
548
|
+
.chain .nm{font-family:var(--display);font-size:20px;display:flex;align-items:center;gap:8px}
|
|
549
|
+
.chain .nm img{width:18px;height:18px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
|
|
550
|
+
.chain .id{font-family:var(--mono);font-size:11px;color:var(--blue);white-space:nowrap;padding-top:4px}
|
|
551
|
+
.chain .meta{
|
|
552
|
+
display:flex;justify-content:space-between;gap:8px;
|
|
553
|
+
font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--mute);
|
|
554
|
+
}
|
|
555
|
+
.badge{border:1px solid var(--line);border-radius:999px;padding:4px 8px;color:var(--cool)}
|
|
556
|
+
.badge.live{border-color:rgba(184,240,255,.35);color:var(--blue)}
|
|
557
|
+
|
|
558
|
+
.venues{margin-top:14px;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:rgba(12,17,23,.85)}
|
|
559
|
+
.venues{background:rgba(12,17,23,.86);border:1px solid rgba(184,240,255,.16);border-radius:16px;overflow:hidden;margin-bottom:14px}
|
|
560
|
+
.venues-head{
|
|
561
|
+
padding:11px 14px;border-bottom:1px solid var(--line);
|
|
562
|
+
font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
|
|
563
|
+
display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;
|
|
564
|
+
}
|
|
565
|
+
.venues-head b{color:var(--blue);font-weight:500}
|
|
566
|
+
.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)}
|
|
567
|
+
.marquee:hover .track{animation-play-state:paused}
|
|
568
|
+
.marquee + .marquee{border-top:1px solid rgba(184,240,255,.08)}
|
|
569
|
+
.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}
|
|
570
|
+
.marquee.rev .track{animation-direction:reverse}
|
|
571
|
+
a.chip{text-decoration:none;color:inherit}
|
|
572
|
+
.chip{
|
|
573
|
+
display:inline-flex;align-items:center;gap:10px;
|
|
574
|
+
font-size:15px;letter-spacing:-.015em;text-transform:none;color:var(--proto-color,var(--cool));
|
|
575
|
+
padding:8px 13px;border:1px solid rgba(184,240,255,.1);border-radius:999px;background:rgba(6,8,11,.38);
|
|
576
|
+
box-shadow:inset 0 0 0 1px rgba(255,255,255,.025);
|
|
577
|
+
transition:border-color .35s var(--ease),background .35s var(--ease),transform .35s var(--ease);
|
|
578
|
+
}
|
|
579
|
+
a.chip:hover{border-color:rgba(184,240,255,.3);background:rgba(21,32,49,.6);transform:translate3d(0,-2px,0)}
|
|
580
|
+
.chip img{width:18px;height:18px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
|
|
581
|
+
.chip.wm-chip{padding:11px 18px}
|
|
582
|
+
.chip img.wm{width:auto;height:27px;max-width:180px;border-radius:0;object-fit:contain;background:none;opacity:1}
|
|
583
|
+
.chip img.wm.tall{height:28px;max-width:32px}
|
|
584
|
+
.chip img.wm.mono{filter:brightness(0) invert(1)}
|
|
585
|
+
|
|
586
|
+
.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}
|
|
587
|
+
.proto-uniswap{--proto-font:"Inter",var(--sans);--proto-color:#ff4dcb;--proto-weight:850}
|
|
588
|
+
.proto-hyperliquid{--proto-font:var(--display);--proto-style:italic;--proto-color:#50d2c1;--proto-weight:500;--proto-track:.01em}
|
|
589
|
+
.proto-polymarket{--proto-font:"Manrope",var(--sans);--proto-color:#7aa7ff;--proto-weight:800;--proto-track:-.035em}
|
|
590
|
+
.proto-aerodrome,.proto-velodrome{--proto-font:"Space Grotesk",var(--sans);--proto-color:#f2f7ff;--proto-weight:700;--proto-transform:lowercase}
|
|
591
|
+
.proto-pancakeswap{--proto-font:"DM Sans",var(--sans);--proto-color:#d1884f;--proto-weight:700}
|
|
592
|
+
.proto-quickswap{--proto-font:"Archivo Black",var(--sans);--proto-color:#35a7ff;--proto-weight:800;--proto-transform:uppercase;--proto-track:.005em}
|
|
593
|
+
.proto-lfj{--proto-font:"Sora",var(--sans);--proto-color:#ff6357;--proto-weight:700;--proto-transform:uppercase;--proto-track:.05em}
|
|
594
|
+
.proto-hyperswap{--proto-font:"Space Grotesk",var(--sans);--proto-color:#69f0d8;--proto-weight:700}
|
|
595
|
+
.proto-curve{--proto-font:"Times New Roman",serif;--proto-color:#f7f3dd;--proto-weight:700;--proto-track:.01em}
|
|
596
|
+
.proto-balancer{--proto-font:"Inter",var(--sans);--proto-color:#f6f6f6;--proto-weight:850;--proto-track:-.055em}
|
|
597
|
+
.proto-pendle{--proto-font:"Sora",var(--sans);--proto-color:#a7f3d0;--proto-weight:700}
|
|
598
|
+
.proto-morpho{--proto-font:"Manrope",var(--sans);--proto-color:#75b9ff;--proto-weight:800;--proto-track:-.04em}
|
|
599
|
+
.proto-gmx{--proto-font:"Archivo Black",var(--sans);--proto-color:#41d3ff;--proto-weight:800;--proto-transform:uppercase;--proto-track:.04em}
|
|
600
|
+
.proto-lifi{--proto-font:"Inter",var(--sans);--proto-color:#d8b4fe;--proto-weight:850;--proto-transform:uppercase;--proto-track:.02em}
|
|
601
|
+
.proto-relay{--proto-font:"Space Grotesk",var(--sans);--proto-color:#f2f7ff;--proto-weight:700;--proto-transform:lowercase}
|
|
602
|
+
.proto-paraswap{--proto-font:"Manrope",var(--sans);--proto-color:#ff9a76;--proto-weight:800}
|
|
603
|
+
.proto-odos{--proto-font:"Sora",var(--sans);--proto-color:#f0f9ff;--proto-weight:700;--proto-transform:lowercase}
|
|
604
|
+
.proto-cow{--proto-font:"DM Sans",var(--sans);--proto-color:#fcd34d;--proto-weight:700}
|
|
605
|
+
.proto-oneinch{--proto-font:"Inter",var(--sans);--proto-color:#9ec5ff;--proto-weight:850;--proto-track:-.045em}
|
|
606
|
+
.proto-jupiter{--proto-font:"Space Grotesk",var(--sans);--proto-color:#f6a5ff;--proto-weight:700}
|
|
607
|
+
.proto-across{--proto-font:"Manrope",var(--sans);--proto-color:#ff6b9b;--proto-weight:800}
|
|
608
|
+
.proto-stargate{--proto-font:"Sora",var(--sans);--proto-color:#9ddcff;--proto-weight:700}
|
|
609
|
+
.proto-magic-eden{--proto-font:"Archivo Black",var(--sans);--proto-color:#dfc7ff;--proto-weight:800;--proto-track:.01em}
|
|
610
|
+
@keyframes scroll{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}
|
|
611
|
+
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
/* dense premium layer: protocol atlas + hero metrics */
|
|
615
|
+
.home-stats{margin-top:clamp(40px,6vw,72px);border-top:1px solid var(--line);padding-top:26px;
|
|
616
|
+
display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;
|
|
617
|
+
width:min(880px,100%);margin:28px auto 0;border:1px solid var(--line);border-radius:16px;overflow:hidden;
|
|
618
|
+
background:var(--line);position:relative;z-index:3;box-shadow:0 24px 70px rgba(0,0,0,.28);
|
|
619
|
+
}
|
|
620
|
+
.home-stat{background:rgba(12,17,23,.82);padding:15px 16px 14px;text-align:left;min-height:86px;position:relative;overflow:hidden}
|
|
621
|
+
.home-stat::after{content:"";position:absolute;inset:-1px;opacity:0;background:radial-gradient(160px 120px at var(--mx,50%) var(--my,50%),rgba(184,240,255,.16),transparent 65%);transition:opacity .35s var(--ease)}
|
|
622
|
+
.home-stat:hover::after{opacity:1}
|
|
623
|
+
.home-stat b{display:block;font-family:var(--display);font-weight:400;font-size:clamp(30px,4vw,46px);line-height:.9;color:var(--ink);letter-spacing:-.03em;position:relative;z-index:1}
|
|
624
|
+
.home-stat span{display:block;margin-top:9px;font-family:var(--mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);position:relative;z-index:1}
|
|
625
|
+
|
|
626
|
+
.protocol-atlas{max-width:min(1280px,100%)}
|
|
627
|
+
.protocol-atlas .section-title{max-width:15ch;font-size:clamp(42px,7vw,84px);line-height:.94;letter-spacing:-.035em}
|
|
628
|
+
.protocol-atlas .section-lede{max-width:62ch}
|
|
629
|
+
.atlas-sticky{position:sticky;top:96px;border:1px solid var(--line);border-radius:22px;overflow:hidden;background:linear-gradient(180deg,rgba(184,240,255,.10),rgba(12,17,23,.88) 42%,rgba(6,8,11,.94));box-shadow:0 30px 90px rgba(0,0,0,.34)}
|
|
630
|
+
.atlas-orbit{height:220px;position:relative;display:grid;place-items:center;border-bottom:1px solid var(--line);overflow:hidden}
|
|
631
|
+
.atlas-orbit::before{content:"";position:absolute;width:360px;height:360px;border-radius:50%;background:radial-gradient(circle,rgba(184,240,255,.24),rgba(184,240,255,.08) 28%,transparent 62%);filter:blur(12px);animation:home-breathe 5.8s var(--ease) infinite}
|
|
632
|
+
.atlas-orbit .orbital{width:124px;height:124px;filter:drop-shadow(0 0 32px rgba(184,240,255,.4))}
|
|
633
|
+
.atlas-copy{padding:clamp(20px,3vw,30px)}
|
|
634
|
+
.atlas-count{font-family:var(--display);font-weight:300;font-size:clamp(64px,9vw,116px);line-height:.82;letter-spacing:-.055em;color:var(--ink)}
|
|
635
|
+
.atlas-count span{font-style:italic;color:var(--blue2)}
|
|
636
|
+
.atlas-sub{margin-top:16px;color:var(--cool);font-size:15px;line-height:1.68;max-width:34ch}
|
|
637
|
+
.atlas-ledger{display:grid;gap:1px;margin-top:24px;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:var(--line)}
|
|
638
|
+
.atlas-ledger div{display:grid;grid-template-columns:1fr auto;gap:16px;padding:11px 13px;background:rgba(6,8,11,.62);font-family:var(--mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--mute)}
|
|
639
|
+
.atlas-ledger b{color:var(--blue2);font-weight:500}
|
|
640
|
+
.mega-oracle{font-family:var(--display);font-weight:300;font-size:clamp(74px,18vw,240px);line-height:.8;letter-spacing:-.06em;text-align:center;color:transparent;-webkit-text-stroke:1px rgba(184,240,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%)}
|
|
641
|
+
|
|
642
|
+
@media (max-width:960px){
|
|
643
|
+
.home-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
644
|
+
.atlas-sticky{position:relative;top:auto}
|
|
645
|
+
}
|
|
646
|
+
@media (max-width:560px){.home-stats{grid-template-columns:1fr}.home-stat{min-height:0}.atlas-orbit{height:170px}.atlas-count{font-size:64px}}
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
/* high-end motion surface, replaces visible DEX/lending lists */
|
|
651
|
+
.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}
|
|
652
|
+
.motion-main{display:flex;flex-direction:column;gap:16px;min-width:0}
|
|
653
|
+
.motion-command{transform-style:preserve-3d}
|
|
654
|
+
.toolbelt{display:flex;flex-wrap:wrap;gap:8px;border:1px solid var(--line);border-radius:999px;padding:9px;background:rgba(6,8,11,.5);box-shadow:inset 0 0 0 1px rgba(255,255,255,.02);overflow:hidden}
|
|
655
|
+
.toolbelt span{font-family:var(--mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:var(--blue2);border:1px solid rgba(184,240,255,.18);border-radius:999px;padding:8px 10px;background:rgba(184,240,255,.045);white-space:nowrap}
|
|
656
|
+
.operator-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
|
|
657
|
+
.motion-card{--mx:50%;--my:50%;position:relative;min-height:252px;border:1px solid var(--line);border-radius:22px;overflow:hidden;padding:clamp(20px,3vw,30px);background:linear-gradient(155deg,rgba(184,240,255,.095),rgba(12,17,23,.84) 34%,rgba(6,8,11,.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)}
|
|
658
|
+
.motion-card::before{content:"";position:absolute;inset:-40%;opacity:.62;background:radial-gradient(340px 220px at var(--mx) var(--my),rgba(222,248,255,.18),transparent 58%),conic-gradient(from var(--spin,0deg),transparent,rgba(184,240,255,.24),transparent 34%,rgba(80,210,193,.18),transparent 66%);filter:blur(26px);transform:translateZ(-1px);animation:card-spin 12s linear infinite}
|
|
659
|
+
.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}
|
|
660
|
+
.motion-card:hover{border-color:rgba(222,248,255,.38);box-shadow:0 34px 110px rgba(0,0,0,.34),0 0 0 1px rgba(222,248,255,.06)}
|
|
661
|
+
.motion-card:hover::after{transform:translateX(120%)}
|
|
662
|
+
.motion-card .num{position:relative;z-index:1;font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
|
|
663
|
+
.motion-card h3{position:relative;z-index:1;margin:44px 0 12px;font-family:var(--display);font-weight:400;font-size:clamp(28px,4vw,46px);line-height:.96;letter-spacing:-.03em}
|
|
664
|
+
.motion-card p{position:relative;z-index:1;color:var(--cool);font-size:15px;line-height:1.62;max-width:34ch}
|
|
665
|
+
.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:9px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute);border-top:1px solid rgba(184,240,255,.12);padding-top:13px}
|
|
666
|
+
.motion-card.is-hot .sig span:last-child{color:var(--blue2)}
|
|
667
|
+
.motion-scan{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent,rgba(184,240,255,.08),transparent);height:38%;animation:scan-pass 4.8s var(--ease) infinite;mix-blend-mode:screen}
|
|
668
|
+
.word-mask{display:inline-block;overflow:hidden;vertical-align:baseline}.word-mask>span{display:inline-block}
|
|
669
|
+
@keyframes card-spin{to{--spin:360deg}}
|
|
670
|
+
@keyframes scan-pass{0%,100%{transform:translateY(-115%);opacity:0}18%,70%{opacity:.7}100%{transform:translateY(215%);opacity:0}}
|
|
671
|
+
@media (max-width:960px){.motion-lab{grid-template-columns:1fr}.operator-grid{grid-template-columns:1fr}.toolbelt{border-radius:18px}.motion-card{min-height:220px}}
|
|
672
|
+
@media (prefers-reduced-motion:reduce){.motion-card::before,.motion-scan{animation:none}.motion-card{will-change:auto}}
|
|
673
|
+
|
|
674
|
+
/* ── hero: product-first split. Real artifact leads, orb is ambience ── */
|
|
675
|
+
.hero-split{
|
|
676
|
+
display:grid;grid-template-columns:minmax(0,.86fr) minmax(0,1.14fr);
|
|
677
|
+
gap:clamp(28px,4vw,56px);align-items:center;text-align:left;width:100%;
|
|
678
|
+
}
|
|
679
|
+
.hero-lede{min-width:0;display:flex;flex-direction:column;align-items:flex-start}
|
|
680
|
+
.hero-lede .home-kicker{margin-bottom:14px}
|
|
681
|
+
.hero-split .home-title{
|
|
682
|
+
font-size:clamp(46px,5.6vw,86px);line-height:.98;letter-spacing:-.035em;
|
|
683
|
+
text-transform:none;text-align:left;margin:0;
|
|
684
|
+
}
|
|
685
|
+
.hero-sub{
|
|
686
|
+
max-width:46ch;margin:20px 0 0;color:var(--cool);
|
|
687
|
+
font-size:clamp(15px,1.15vw,17px);line-height:1.65;text-shadow:0 1px 20px rgba(0,0,0,.6);
|
|
688
|
+
}
|
|
689
|
+
.hero-split .home-actions{justify-content:flex-start;margin-top:30px}
|
|
690
|
+
.enter-cta.primary{
|
|
691
|
+
background:linear-gradient(180deg,rgba(222,248,255,.98),rgba(184,240,255,.9));
|
|
692
|
+
color:#04121C;border-color:transparent;font-weight:600;
|
|
693
|
+
}
|
|
694
|
+
.enter-cta.primary::after{color:#04121C}
|
|
695
|
+
.enter-cta.primary:hover{box-shadow:0 0 0 1px rgba(222,248,255,.4),0 22px 54px rgba(184,240,255,.22)}
|
|
696
|
+
.enter-cta.ghost{background:none}
|
|
697
|
+
.hero-note-line{
|
|
698
|
+
margin-top:18px;font-family:var(--mono);font-size:10px;letter-spacing:.14em;
|
|
699
|
+
text-transform:uppercase;color:var(--mute);
|
|
700
|
+
}
|
|
701
|
+
.hero-note-line code{color:var(--blue2);font-size:10.5px}
|
|
702
|
+
|
|
703
|
+
.hero-product{position:relative;margin:0;min-width:0;perspective:1600px;overflow:clip}
|
|
704
|
+
.hero-product .hero-art{position:absolute;inset:-22% -14%;z-index:0;opacity:.5}
|
|
705
|
+
.hero-product .hero-orb{width:min(100%,560px)}
|
|
706
|
+
.hero-shot{
|
|
707
|
+
position:relative;z-index:1;border-radius:14px;overflow:hidden;
|
|
708
|
+
border:1px solid var(--line-2);background:#05080D;
|
|
709
|
+
box-shadow:0 40px 120px rgba(0,0,0,.62),0 0 0 1px rgba(222,248,255,.06),inset 0 1px 0 rgba(255,255,255,.05);
|
|
710
|
+
transform:perspective(2000px) rotateY(-4deg) rotateX(1.5deg);
|
|
711
|
+
transition:transform 1s var(--ease),box-shadow 1s var(--ease);
|
|
712
|
+
/* Bleed toward the viewport edge so the shot reads at a legible size. */
|
|
713
|
+
width:calc(100% + max(0px,(100vw - var(--max))/2 - var(--pad) + 20px));
|
|
714
|
+
max-width:none;
|
|
715
|
+
}
|
|
716
|
+
.hero-shot img{display:block;width:100%;height:auto}
|
|
717
|
+
.hero-shot::after{
|
|
718
|
+
content:"";position:absolute;inset:0;pointer-events:none;
|
|
719
|
+
background:linear-gradient(130deg,rgba(222,248,255,.1),transparent 42%);
|
|
720
|
+
}
|
|
721
|
+
.hero-product:hover .hero-shot{transform:perspective(2000px) rotateY(-1deg) rotateX(.5deg)}
|
|
722
|
+
.hero-product figcaption{
|
|
723
|
+
position:relative;z-index:1;margin-top:14px;font-family:var(--mono);font-size:9px;
|
|
724
|
+
letter-spacing:.2em;text-transform:uppercase;color:var(--mute);text-align:right;
|
|
725
|
+
}
|
|
726
|
+
@media (max-width:960px){
|
|
727
|
+
.hero-split{grid-template-columns:minmax(0,1fr);gap:36px}
|
|
728
|
+
.hero-shot{transform:none;width:100%}
|
|
729
|
+
.hero-product .hero-art{inset:-10% -6%;opacity:.34}
|
|
730
|
+
.hero-product figcaption{text-align:left}
|
|
731
|
+
}
|
|
732
|
+
@media (prefers-reduced-motion:reduce){.hero-shot{transform:none;transition:none}}
|
|
733
|
+
|
|
734
|
+
/* Route proof: the ranking claim, recorded. */
|
|
735
|
+
.risk-proof,
|
|
736
|
+
.route-proof{position:relative;margin:0 auto clamp(28px,4vw,44px);max-width:868px;border:1px solid rgba(184,240,255,.16);border-radius:14px;overflow:hidden;background:#080d15;line-height:0}
|
|
737
|
+
.risk-proof video,
|
|
738
|
+
.route-proof video{display:block;width:100%;max-width:868px;height:auto;opacity:0;transition:opacity .5s var(--ease)}
|
|
739
|
+
.risk-proof video.ready,
|
|
740
|
+
.route-proof video.ready{opacity:1}
|
|
741
|
+
.risk-proof #risk-still,
|
|
742
|
+
.route-proof #route-still{display:block;width:100%;max-width:868px;height:auto}
|
|
743
|
+
.risk-proof video.ready ~ #risk-still,
|
|
744
|
+
.route-proof video.ready ~ #route-still{position:absolute;inset:0;opacity:0;pointer-events:none}
|
|
745
|
+
.risk-proof figcaption,
|
|
746
|
+
.route-proof figcaption{line-height:1.4;padding:10px 14px;border-top:1px solid rgba(184,240,255,.12);font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--blue2)}
|
|
747
|
+
@media (prefers-reduced-motion:reduce){
|
|
748
|
+
.risk-proof video,
|
|
749
|
+
.route-proof video{display:none}
|
|
750
|
+
.risk-proof #risk-still,
|
|
751
|
+
.route-proof #route-still{position:static;opacity:1}
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/* The orb is the hero mark, so it drops the terminal panel chrome entirely:
|
|
755
|
+
no border, no dark fill, no 3D tilt, no edge bleed. */
|
|
756
|
+
.hero-shot-orb{
|
|
757
|
+
border:0;background:transparent;box-shadow:none;transform:none;overflow:visible;
|
|
758
|
+
width:min(100%,560px);margin-inline:auto;border-radius:0;
|
|
759
|
+
}
|
|
760
|
+
.hero-shot-orb::after{display:none}
|
|
761
|
+
.hero-product:hover .hero-shot-orb{transform:none}
|
|
762
|
+
.hero-shot-orb video,
|
|
763
|
+
.hero-shot-orb #orb-still{
|
|
764
|
+
display:block;width:100%;height:auto;mix-blend-mode:screen;
|
|
765
|
+
}
|
|
766
|
+
.hero-shot-orb video{opacity:0;transition:opacity .6s var(--ease)}
|
|
767
|
+
.hero-shot-orb video.ready{opacity:1}
|
|
768
|
+
.hero-shot-orb video.ready ~ #orb-still{position:absolute;inset:0;opacity:0;pointer-events:none}
|
|
769
|
+
@media (prefers-reduced-motion:reduce){
|
|
770
|
+
.hero-shot-orb video{display:none}
|
|
771
|
+
.hero-shot-orb #orb-still{position:static;opacity:1}
|
|
772
|
+
}
|
|
773
|
+
/* CLI section now carries the real recorded session. */
|
|
774
|
+
.cli-proof{position:relative;aspect-ratio:auto;height:auto;min-height:0;padding:0;
|
|
775
|
+
max-width:868px;margin-inline:auto;line-height:0;display:block}
|
|
776
|
+
.cli-proof video{display:block;width:100%;height:auto;opacity:0;transition:opacity .6s var(--ease)}
|
|
777
|
+
.cli-proof video.ready{opacity:1}
|
|
778
|
+
.cli-proof #cli-still{display:block;width:100%;height:auto}
|
|
779
|
+
.cli-proof video.ready ~ #cli-still{position:absolute;inset:0;opacity:0;pointer-events:none}
|
|
780
|
+
@media (prefers-reduced-motion:reduce){
|
|
781
|
+
.cli-proof video{display:none}
|
|
782
|
+
.cli-proof #cli-still{position:static;opacity:1}
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
/* Recorded session leads; the still is the fallback underneath it. */
|
|
786
|
+
.hero-shot{position:relative}
|
|
787
|
+
.hero-shot video{display:block;width:100%;height:auto;opacity:0;transition:opacity .6s var(--ease)}
|
|
788
|
+
.hero-shot video.ready{opacity:1}
|
|
789
|
+
.hero-shot video.ready + #cli-still{opacity:0}
|
|
790
|
+
#cli-still{display:block;width:100%;height:auto;transition:opacity .6s var(--ease)}
|
|
791
|
+
.hero-shot video.ready ~ #cli-still{position:absolute;inset:0;pointer-events:none}
|
|
792
|
+
@media (prefers-reduced-motion:reduce){
|
|
793
|
+
.hero-shot video{display:none}
|
|
794
|
+
#cli-still{position:static;opacity:1}
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);padding:32px var(--pad) 40px;position:relative;z-index:2}
|
|
798
|
+
.labs-link{font-family:"UnifrakturCook","Old English Text MT","Lucida Blackletter",serif;font-size:16px;letter-spacing:.04em;text-transform:none;color:var(--blue2)}
|
|
799
|
+
.labs-link:hover{color:var(--ink)}
|
|
800
|
+
.foot-row{
|
|
801
|
+
max-width:var(--max);margin:0 auto 14px;
|
|
802
|
+
display:flex;flex-wrap:wrap;gap:14px 24px;justify-content:space-between;align-items:center;
|
|
803
|
+
}
|
|
804
|
+
.powered{
|
|
805
|
+
display:inline-flex;align-items:center;gap:10px;
|
|
806
|
+
font-family:var(--mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
|
|
807
|
+
}
|
|
808
|
+
.powered .mark{width:7px;height:7px;border-radius:50%;background:var(--blue);box-shadow:0 0 12px rgba(184,240,255,.7)}
|
|
809
|
+
.powered a{color:var(--blue);font-weight:600;border-bottom:1px solid transparent;transition:border-color .25s,color .25s}
|
|
810
|
+
.powered a:hover{border-bottom-color:var(--blue);color:var(--ink)}
|
|
811
|
+
.foot-links{display:flex;gap:18px;font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
|
|
812
|
+
.foot-links a:hover{color:var(--blue)}
|
|
813
|
+
.foot-meta{
|
|
814
|
+
max-width:var(--max);margin:0 auto;
|
|
815
|
+
display:flex;flex-wrap:wrap;gap:12px 22px;justify-content:space-between;
|
|
816
|
+
font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
.js .rv{opacity:0;transform:translate3d(0,22px,0);will-change:opacity,transform}
|
|
820
|
+
.js .rv.in{opacity:1;transform:translate3d(0,0,0);transition:opacity 1.05s var(--ease),transform 1.05s var(--ease)}
|
|
821
|
+
.js .rv.done{transform:none;will-change:auto}
|
|
822
|
+
|
|
823
|
+
@media (max-width:960px){
|
|
824
|
+
.home-inner{max-width:760px}
|
|
825
|
+
.hero-stage{min-height:clamp(300px,44vh,460px)}.home-title{font-size:clamp(80px,20vw,150px)}
|
|
826
|
+
.nav-chip{display:none}
|
|
827
|
+
.nav-links .hide-sm{display:none}
|
|
828
|
+
.route-strip{grid-template-columns:1fr}
|
|
829
|
+
.chain-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
830
|
+
.row.profiles{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
831
|
+
}
|
|
832
|
+
@media (max-width:720px){
|
|
833
|
+
:root{--pad:clamp(16px,5vw,24px)}
|
|
834
|
+
.cli-frame,.cli-frame img,.convert-copy,.convert-grid{max-width:100%;width:100%}
|
|
835
|
+
.cli-frame img{height:auto}
|
|
836
|
+
main{padding-top:68px}
|
|
837
|
+
.nav{padding:12px var(--pad)}
|
|
838
|
+
.brand{font-size:22px}
|
|
839
|
+
.brand .orbital{width:24px;height:24px}
|
|
840
|
+
.home{min-height:auto;padding-top:22px;padding-bottom:58px}
|
|
841
|
+
.home::after{bottom:8px;height:48px}
|
|
842
|
+
.hero-stage{min-height:240px}
|
|
843
|
+
.hero-orb{width:min(78vw,300px)}
|
|
844
|
+
.hero-orb .orbit-dot{animation-name:orbit-travel-mobile}
|
|
845
|
+
@keyframes orbit-travel-mobile{from{transform:rotateX(76deg) rotateZ(0deg) translateX(min(30vw,128px))}to{transform:rotateX(76deg) rotateZ(360deg) translateX(min(30vw,128px))}}
|
|
846
|
+
.home-title{font-size:clamp(64px,19vw,82px);letter-spacing:-.05em}
|
|
847
|
+
.home-kicker{font-size:9px;letter-spacing:.22em}
|
|
848
|
+
.home-copy p:not(.home-kicker){max-width:34ch;font-size:15px;line-height:1.58;margin-top:14px}
|
|
849
|
+
.home-actions{width:100%;margin-top:22px}
|
|
850
|
+
.enter-cta{width:100%;max-width:280px;min-height:48px;justify-content:center;padding:13px 18px}
|
|
851
|
+
.section{padding:clamp(44px,8vh,72px) var(--pad) 0}
|
|
852
|
+
.section-label{letter-spacing:.22em}
|
|
853
|
+
.section-title{font-size:clamp(30px,11vw,42px);max-width:12ch}
|
|
854
|
+
.section-lede{font-size:15px;line-height:1.6;margin-bottom:24px}
|
|
855
|
+
.graph-top{justify-content:flex-start;padding:12px;font-size:9px;line-height:1.55;letter-spacing:.12em}
|
|
856
|
+
.evolve-rail{justify-content:flex-start;flex-wrap:nowrap;overflow-x:auto;padding:12px;-webkit-overflow-scrolling:touch}
|
|
857
|
+
.evolve-pill{white-space:nowrap;flex:0 0 auto}
|
|
858
|
+
.graph-canvas{overflow:visible;padding:22px 12px 24px}
|
|
859
|
+
.orch{width:100%;min-width:0}
|
|
860
|
+
.row{gap:10px}
|
|
861
|
+
.row>.node[style]{width:100%!important;max-width:260px}
|
|
862
|
+
.node.hub{width:100%;max-width:260px}
|
|
863
|
+
.row.profiles{grid-template-columns:1fr}
|
|
864
|
+
.node.route,.node.add,.node.builder-sink{min-height:auto}
|
|
865
|
+
.node.route .chains{line-height:1.55}
|
|
866
|
+
.wires{height:34px;overflow:hidden}
|
|
867
|
+
.wires.funnel{height:42px}
|
|
868
|
+
.builder-row{margin-top:4px}
|
|
869
|
+
.route-card{min-height:auto;padding:20px 16px;background:rgba(12,17,23,.94)}
|
|
870
|
+
.route-card h3{font-size:23px;line-height:1.05;flex-wrap:wrap}
|
|
871
|
+
.why-band{padding:20px 16px 22px}
|
|
872
|
+
.hl-surface{padding:16px}
|
|
873
|
+
.chain .id{white-space:normal;text-align:right}
|
|
874
|
+
.venues-head{font-size:9px;letter-spacing:.12em;line-height:1.5}
|
|
875
|
+
.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}
|
|
876
|
+
.marquee::-webkit-scrollbar{display:none}
|
|
877
|
+
.marquee .track,.marquee.rev .track{min-width:max-content;animation:none;transform:none;will-change:auto}
|
|
878
|
+
.track{gap:16px}
|
|
879
|
+
.chip{font-size:14px;padding:8px 11px}
|
|
880
|
+
.chip.wm-chip{padding:10px 14px}
|
|
881
|
+
.chip img.wm{height:24px;max-width:132px}
|
|
882
|
+
footer{padding:28px var(--pad) 34px}
|
|
883
|
+
.foot-row,.foot-meta{justify-content:center;text-align:center}
|
|
884
|
+
.foot-links{flex-wrap:wrap;justify-content:center;gap:12px 16px}
|
|
885
|
+
}
|
|
886
|
+
@media (max-width:560px){
|
|
887
|
+
.chain-grid{grid-template-columns:1fr}
|
|
888
|
+
}
|
|
889
|
+
@media (max-width:380px){
|
|
890
|
+
.home-title{font-size:62px}
|
|
891
|
+
.hero-stage{min-height:220px}
|
|
892
|
+
.section-title{font-size:30px}
|
|
893
|
+
}
|
|
894
|
+
@media (prefers-reduced-motion:reduce){
|
|
895
|
+
html{scroll-behavior:auto}
|
|
896
|
+
.js .rv{opacity:1;transform:none;filter:none}
|
|
897
|
+
.track,.orbital .ring,.orbital .tickring,.orbital .core,.hero-orb,.hero-art::before,.home::after{animation:none}
|
|
898
|
+
.wires path{stroke-dasharray:none;stroke-dashoffset:0}
|
|
899
|
+
.wires circle{opacity:1}
|
|
900
|
+
.node:hover,.chain:hover{transform:none}
|
|
901
|
+
}
|
|
902
|
+
</style>
|
|
903
|
+
</head>
|
|
904
|
+
<body>
|
|
905
|
+
<div class="grain" aria-hidden="true"></div>
|
|
906
|
+
<div class="progress" id="progress" aria-hidden="true"></div>
|
|
907
|
+
|
|
908
|
+
<div class="loader" id="loader" aria-hidden="true">
|
|
909
|
+
<div class="loader-inner">
|
|
910
|
+
<div class="loader-mark orbital" aria-hidden="true">
|
|
911
|
+
<svg viewBox="0 0 100 100">
|
|
912
|
+
<g class="ring r1"><ellipse cx="50" cy="50" rx="44" ry="15"/></g>
|
|
913
|
+
<g class="ring r2"><ellipse cx="50" cy="50" rx="44" ry="15" transform="rotate(62 50 50)"/></g>
|
|
914
|
+
<g class="ring r3"><ellipse cx="50" cy="50" rx="44" ry="15" transform="rotate(124 50 50)"/></g>
|
|
915
|
+
<circle class="tickring" cx="50" cy="50" r="30"/>
|
|
916
|
+
<circle class="halo" cx="50" cy="50" r="9"/>
|
|
917
|
+
<circle class="core" cx="50" cy="50" r="6.5"/>
|
|
918
|
+
</svg>
|
|
919
|
+
</div>
|
|
920
|
+
<div class="loader-word">oracle</div>
|
|
921
|
+
<div class="loader-bar"><span id="loader-fill"></span></div>
|
|
922
|
+
</div>
|
|
923
|
+
</div>
|
|
924
|
+
|
|
925
|
+
<header class="nav">
|
|
926
|
+
<a class="brand" href="#top">
|
|
927
|
+
<span class="orbital" aria-hidden="true">
|
|
928
|
+
<svg viewBox="0 0 100 100">
|
|
929
|
+
<g class="ring r1"><ellipse cx="50" cy="50" rx="45" ry="17"/></g>
|
|
930
|
+
<g class="ring r2"><ellipse cx="50" cy="50" rx="45" ry="17" transform="rotate(64 50 50)"/></g>
|
|
931
|
+
<circle class="halo" cx="50" cy="50" r="13"/>
|
|
932
|
+
<circle class="core" cx="50" cy="50" r="11"/>
|
|
933
|
+
</svg>
|
|
934
|
+
</span>
|
|
935
|
+
oracle</a>
|
|
936
|
+
<nav class="nav-links" aria-label="Primary">
|
|
937
|
+
<a class="hide-sm" href="#cli">CLI</a>
|
|
938
|
+
<a class="hide-sm" href="#orchestration">Profiles</a>
|
|
939
|
+
<a class="hide-sm" href="#strategies">Strategies</a>
|
|
940
|
+
<a class="hide-sm" href="#protocols">Protocols</a>
|
|
941
|
+
<a class="hide-sm" href="#chains">Chains</a>
|
|
942
|
+
<a href="/downloads/">Download</a>
|
|
943
|
+
</nav>
|
|
944
|
+
</header>
|
|
945
|
+
|
|
946
|
+
<main id="top">
|
|
947
|
+
<canvas id="gl" aria-hidden="true"></canvas>
|
|
948
|
+
<div class="veil" aria-hidden="true"></div>
|
|
949
|
+
|
|
950
|
+
<section class="home" id="home">
|
|
951
|
+
<div class="home-inner">
|
|
952
|
+
<div class="hero-split">
|
|
953
|
+
<div class="hero-lede">
|
|
954
|
+
<p class="home-kicker">self-custody agent control</p>
|
|
955
|
+
<h1 class="home-title">Trade every chain<br>from <em>one</em> agent</h1>
|
|
956
|
+
<p class="hero-sub">Hyperliquid, Polymarket, 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>
|
|
957
|
+
<div class="home-actions">
|
|
958
|
+
<a class="enter-cta primary" href="/downloads/">Download beta</a>
|
|
959
|
+
<a class="enter-cta ghost" href="#cli">See the CLI</a>
|
|
960
|
+
</div>
|
|
961
|
+
<p class="hero-note-line">macOS · Windows · Linux / public CLI and desktop beta</p>
|
|
962
|
+
</div>
|
|
963
|
+
|
|
964
|
+
<figure class="hero-product">
|
|
965
|
+
<div class="hero-art" aria-hidden="true">
|
|
966
|
+
<div class="hero-orb" id="hero-orb">
|
|
967
|
+
<span class="lat l1"></span><span class="lat l2"></span><span class="lat l3"></span><span class="lat l4"></span>
|
|
968
|
+
<span class="par p1"></span><span class="par p2"></span><span class="par p3"></span>
|
|
969
|
+
<span class="eq"></span>
|
|
970
|
+
<span class="core-glow"></span>
|
|
971
|
+
<span class="orbit-dot"></span>
|
|
972
|
+
</div>
|
|
973
|
+
</div>
|
|
974
|
+
<div class="hero-shot hero-shot-orb" id="hero-title">
|
|
975
|
+
<video id="orb-video" width="900" height="900"
|
|
976
|
+
poster="../assets/hero/orb.avif?v=30fps"
|
|
977
|
+
muted loop playsinline autoplay preload="metadata"
|
|
978
|
+
aria-label="Oracle mark">
|
|
979
|
+
<source src="../assets/hero/orb.webm?v=30fps" type="video/webm">
|
|
980
|
+
</video>
|
|
981
|
+
<img id="orb-still" src="../assets/hero/orb.avif?v=30fps" alt="Oracle mark" width="760" height="760" loading="eager" fetchpriority="high" decoding="async">
|
|
982
|
+
</div>
|
|
983
|
+
<figcaption>the future is agentic</figcaption>
|
|
984
|
+
</figure>
|
|
985
|
+
</div>
|
|
986
|
+
|
|
987
|
+
<div class="home-stats rv" aria-label="Oracle surface metrics">
|
|
988
|
+
<div class="home-stat"><b id="hero-protocol-count">110</b><span>protocol entries wired</span></div>
|
|
989
|
+
<div class="home-stat"><b>49</b><span>data providers</span></div>
|
|
990
|
+
<div class="home-stat"><b id="hero-chain-count">12</b><span>chains and venues</span></div>
|
|
991
|
+
<div class="home-stat"><b>0</b><span>keys held by Oracle</span></div>
|
|
992
|
+
</div>
|
|
993
|
+
</div>
|
|
994
|
+
</section>
|
|
995
|
+
|
|
996
|
+
<section class="section cli-section" id="cli">
|
|
997
|
+
<p class="section-label rv">Oracle CLI</p>
|
|
998
|
+
<h2 class="section-title rv">One surface. <em>Every chain.</em></h2>
|
|
999
|
+
<div class="cli-install rv">
|
|
1000
|
+
<div class="cli-install-cmd"><code>npm i -g @oracle-agent/oracle</code></div>
|
|
1001
|
+
<p class="cli-install-gate"><b>Locals Only</b> holders get 0% Oracle integrator fees. Everyone gets the same public CLI, desktop, source, and prepare-only product access.</p>
|
|
1002
|
+
</div>
|
|
1003
|
+
<p class="section-lede rv">The real Oracle shell, isolated from desktop chrome. Pin the active surface with <code style="color:var(--blue2)">/chain hyperliquid</code>, switch models with <code style="color:var(--blue2)">/model</code>, then ask naturally.</p>
|
|
1004
|
+
<div class="convert-grid rv">
|
|
1005
|
+
<div>
|
|
1006
|
+
<figure class="cli-frame cli-proof">
|
|
1007
|
+
<video id="cli-session" width="868" height="456"
|
|
1008
|
+
poster="../assets/hero/cli-session-poster.jpg"
|
|
1009
|
+
muted loop playsinline preload="metadata"
|
|
1010
|
+
aria-label="Recorded Oracle CLI session selecting hyperliquid and reading live chain state">
|
|
1011
|
+
<source src="../assets/hero/cli-session.webm" type="video/webm">
|
|
1012
|
+
<source src="../assets/hero/cli-session.mp4" type="video/mp4">
|
|
1013
|
+
</video>
|
|
1014
|
+
<img id="cli-still" src="../assets/cli-chain-hyperliquid.jpg?v=cli-visible" alt="Oracle CLI selecting Hyperliquid with the /chain hyperliquid command" width="1600" height="900" loading="eager" fetchpriority="high" />
|
|
1015
|
+
</figure>
|
|
1016
|
+
<p class="cli-cap">actual oracle shell // /chain hyperliquid</p>
|
|
1017
|
+
</div>
|
|
1018
|
+
<div class="convert-copy">
|
|
1019
|
+
<h3>The actual Oracle CLI</h3>
|
|
1020
|
+
<p>The active chain follows each read, quote, prepare, and bounded execution path.</p>
|
|
1021
|
+
<div class="convert-pills">
|
|
1022
|
+
<span>HyperCore + HyperEVM</span>
|
|
1023
|
+
<span>multichain routing</span>
|
|
1024
|
+
<span>self-custody</span>
|
|
1025
|
+
</div>
|
|
1026
|
+
<p class="platform-beta"><b>Beta</b> Linux, Windows, and macOS desktop apps are in beta and <a href="/downloads/" style="color:var(--blue2);text-decoration:underline;text-underline-offset:3px">available to download</a>. The CLI runs on all three today.</p>
|
|
1027
|
+
<div class="cli-code">
|
|
1028
|
+
<div><b>oracle ›</b> /chain hyperliquid</div>
|
|
1029
|
+
<div><b>oracle ›</b> /chain show</div>
|
|
1030
|
+
<div><b>oracle ›</b> what can you do on hyperliquid?</div>
|
|
1031
|
+
</div>
|
|
1032
|
+
</div>
|
|
1033
|
+
</div>
|
|
1034
|
+
</section>
|
|
1035
|
+
|
|
1036
|
+
<section class="section" id="orchestration">
|
|
1037
|
+
<p class="section-label rv">Profiles</p>
|
|
1038
|
+
<h2 class="section-title rv">Multi-profile. <em>Customizable.</em></h2>
|
|
1039
|
+
<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>
|
|
1040
|
+
|
|
1041
|
+
<div class="graph-shell rv">
|
|
1042
|
+
<div class="graph-top">
|
|
1043
|
+
<span>multi-profile // protocol builder // multi-chain</span>
|
|
1044
|
+
</div>
|
|
1045
|
+
|
|
1046
|
+
<div class="evolve-rail">
|
|
1047
|
+
<span class="evolve-pill on">customizable</span>
|
|
1048
|
+
<span class="evolve-pill on">protocol builder</span>
|
|
1049
|
+
<span class="evolve-pill on">more chains</span>
|
|
1050
|
+
</div>
|
|
1051
|
+
|
|
1052
|
+
<div class="graph-canvas">
|
|
1053
|
+
<div class="orch" aria-label="Oracle multi-profile graph">
|
|
1054
|
+
<div class="row">
|
|
1055
|
+
<div class="node" style="width:220px">
|
|
1056
|
+
<div class="tag">you</div>
|
|
1057
|
+
<div class="name">Input / Command</div>
|
|
1058
|
+
<div class="sub">what you type or ask</div>
|
|
1059
|
+
</div>
|
|
1060
|
+
</div>
|
|
1061
|
+
|
|
1062
|
+
<div class="wires" aria-hidden="true">
|
|
1063
|
+
<svg viewBox="0 0 100 36" preserveAspectRatio="none">
|
|
1064
|
+
<path d="M50 2 V34" pathLength="1"/><circle cx="50" cy="2" r="1.4"/><circle cx="50" cy="34" r="1.4"/>
|
|
1065
|
+
</svg>
|
|
1066
|
+
</div>
|
|
1067
|
+
|
|
1068
|
+
<div class="row">
|
|
1069
|
+
<div class="node hub">
|
|
1070
|
+
<div class="tag">control plane</div>
|
|
1071
|
+
<div class="orbital" aria-hidden="true">
|
|
1072
|
+
<svg viewBox="0 0 100 100">
|
|
1073
|
+
<g class="ring r1"><ellipse cx="50" cy="50" rx="46" ry="16"/></g>
|
|
1074
|
+
<g class="ring r2"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(60 50 50)"/></g>
|
|
1075
|
+
<g class="ring r3"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(120 50 50)"/></g>
|
|
1076
|
+
<circle class="tickring" cx="50" cy="50" r="32"/>
|
|
1077
|
+
<circle class="halo" cx="50" cy="50" r="10"/>
|
|
1078
|
+
<circle class="core" cx="50" cy="50" r="7.5"/>
|
|
1079
|
+
</svg>
|
|
1080
|
+
</div>
|
|
1081
|
+
<div class="name">oracle</div>
|
|
1082
|
+
<div class="sub">route · bound · evolve</div>
|
|
1083
|
+
</div>
|
|
1084
|
+
</div>
|
|
1085
|
+
|
|
1086
|
+
<div class="wires multi" aria-hidden="true">
|
|
1087
|
+
<svg viewBox="0 0 100 44" preserveAspectRatio="none">
|
|
1088
|
+
<path d="M50 2 V12" pathLength="1"/>
|
|
1089
|
+
<path class="w-poly w-2" d="M12.5 42 V20 H50 V12" pathLength="1"/>
|
|
1090
|
+
<path class="w-hl w-3" d="M37.5 42 V20 H50 V12" pathLength="1"/>
|
|
1091
|
+
<path class="w-rh w-4" d="M62.5 42 V20 H50 V12" pathLength="1"/>
|
|
1092
|
+
<path class="w-sol w-5" d="M87.5 42 V20 H50 V12" pathLength="1"/>
|
|
1093
|
+
<circle cx="50" cy="2" r="1.3"/>
|
|
1094
|
+
<circle class="c-poly" cx="12.5" cy="42" r="1.3"/>
|
|
1095
|
+
<circle class="c-hl" cx="37.5" cy="42" r="1.3"/>
|
|
1096
|
+
<circle class="c-rh" cx="62.5" cy="42" r="1.3"/>
|
|
1097
|
+
<circle class="c-sol" cx="87.5" cy="42" r="1.3"/>
|
|
1098
|
+
</svg>
|
|
1099
|
+
</div>
|
|
1100
|
+
|
|
1101
|
+
<div class="row profiles" id="profile-grid">
|
|
1102
|
+
<div class="node route p-poly">
|
|
1103
|
+
<div class="tag">profile</div>
|
|
1104
|
+
<div class="name">polymarket agent</div>
|
|
1105
|
+
<div class="sub">events · arb · markets</div>
|
|
1106
|
+
<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>
|
|
1107
|
+
</div>
|
|
1108
|
+
<div class="node route p-hl">
|
|
1109
|
+
<div class="tag">profile</div>
|
|
1110
|
+
<div class="name">hyperliquid agent</div>
|
|
1111
|
+
<div class="sub">perps · hip-3/4 · ta</div>
|
|
1112
|
+
<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>
|
|
1113
|
+
</div>
|
|
1114
|
+
<div class="node route p-rh">
|
|
1115
|
+
<div class="tag">profile</div>
|
|
1116
|
+
<div class="name">robinhood agent</div>
|
|
1117
|
+
<div class="sub">markets · memecoins · nfts</div>
|
|
1118
|
+
<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>
|
|
1119
|
+
</div>
|
|
1120
|
+
<div class="node route p-sol">
|
|
1121
|
+
<div class="tag">profile</div>
|
|
1122
|
+
<div class="name">solana agent</div>
|
|
1123
|
+
<div class="sub">jup · nfts · markets</div>
|
|
1124
|
+
<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>
|
|
1125
|
+
</div>
|
|
1126
|
+
<div class="node route p-btc">
|
|
1127
|
+
<div class="tag">profile</div>
|
|
1128
|
+
<div class="name">bitcoin agent</div>
|
|
1129
|
+
<div class="sub">ord · runes · research</div>
|
|
1130
|
+
<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>
|
|
1131
|
+
</div>
|
|
1132
|
+
<div class="node route p-evm">
|
|
1133
|
+
<div class="tag">profile</div>
|
|
1134
|
+
<div class="name">evm / bridge agent</div>
|
|
1135
|
+
<div class="sub">swaps · bridges · defi</div>
|
|
1136
|
+
<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">Base <img src="https://icons.llamao.fi/icons/chains/rsz_base?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>
|
|
1137
|
+
</div>
|
|
1138
|
+
<div class="node route p-stable">
|
|
1139
|
+
<div class="tag">profile</div>
|
|
1140
|
+
<div class="name">stable agent</div>
|
|
1141
|
+
<div class="sub">launches · memecoins</div>
|
|
1142
|
+
<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>
|
|
1143
|
+
</div>
|
|
1144
|
+
</div>
|
|
1145
|
+
|
|
1146
|
+
<div class="wires funnel" aria-hidden="true">
|
|
1147
|
+
<svg viewBox="0 0 100 62" preserveAspectRatio="none">
|
|
1148
|
+
<path class="w-1" d="M6 2 C6 30 50 22 50 60" pathLength="1"/>
|
|
1149
|
+
<path class="w-2" d="M19 2 C19 28 50 26 50 60" pathLength="1"/>
|
|
1150
|
+
<path class="w-3" d="M32 2 C32 34 50 34 50 60" pathLength="1"/>
|
|
1151
|
+
<path class="w-4" d="M45 2 C45 38 50 42 50 60" pathLength="1"/>
|
|
1152
|
+
<path class="w-5" d="M55 2 C55 38 50 42 50 60" pathLength="1"/>
|
|
1153
|
+
<path class="w-3" d="M68 2 C68 34 50 34 50 60" pathLength="1"/>
|
|
1154
|
+
<path class="w-2" d="M81 2 C81 28 50 26 50 60" pathLength="1"/>
|
|
1155
|
+
<path class="w-1" d="M94 2 C94 30 50 22 50 60" pathLength="1"/>
|
|
1156
|
+
<circle cx="50" cy="60" r="1.8"/>
|
|
1157
|
+
</svg>
|
|
1158
|
+
</div>
|
|
1159
|
+
|
|
1160
|
+
<div class="row builder-row">
|
|
1161
|
+
<div class="node route p-build builder-sink">
|
|
1162
|
+
<div class="tag">bottom layer</div>
|
|
1163
|
+
<div class="name">protocol builder</div>
|
|
1164
|
+
<div class="sub">every profile can funnel into new contracts, scripts, checks, deploy prep, and chain-specific scaffolds.</div>
|
|
1165
|
+
<div class="chains"><span class="ch">any EVM · pinned factories · user-signed deploys</span></div>
|
|
1166
|
+
</div>
|
|
1167
|
+
</div>
|
|
1168
|
+
</div>
|
|
1169
|
+
</div>
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
<div class="route-strip">
|
|
1174
|
+
<article class="route-card p-poly">
|
|
1175
|
+
<div class="where">polymarket agent →</div>
|
|
1176
|
+
<h3>Polymarket <img src="https://icons.llamao.fi/icons/protocols/polymarket?w=40&h=40" alt="Polymarket" loading="lazy"></h3>
|
|
1177
|
+
<p>Event markets, sports, arb paths, and prediction flow under bounds you set. CLOB prepare shipped in the public plane.</p>
|
|
1178
|
+
<div class="chips">
|
|
1179
|
+
<span class="chip-s">events</span>
|
|
1180
|
+
<span class="chip-s">arb</span>
|
|
1181
|
+
<span class="chip-s">clob prepare</span>
|
|
1182
|
+
</div>
|
|
1183
|
+
</article>
|
|
1184
|
+
<article class="route-card p-hl">
|
|
1185
|
+
<div class="where">hyperliquid agent →</div>
|
|
1186
|
+
<h3>Hyperliquid <img src="https://icons.llamao.fi/icons/protocols/hyperliquid?w=40&h=40" alt="Hyperliquid" loading="lazy"></h3>
|
|
1187
|
+
<p>Native perps, HIP-3/4 asset resolve, TA, event risk, and Hyperliquid when you need HL's EVM surface.</p>
|
|
1188
|
+
<div class="chips">
|
|
1189
|
+
<span class="chip-s">perps</span>
|
|
1190
|
+
<span class="chip-s">HIP-3/4</span>
|
|
1191
|
+
<span class="chip-s">Hyperliquid</span>
|
|
1192
|
+
</div>
|
|
1193
|
+
</article>
|
|
1194
|
+
<article class="route-card p-rh">
|
|
1195
|
+
<div class="where">robinhood agent →</div>
|
|
1196
|
+
<h3>Robinhood <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=40&h=40" alt="Robinhood Chain" loading="lazy"></h3>
|
|
1197
|
+
<p>RH Chain markets, memecoins, NFTs, names, token scans, and chain-local routing.</p>
|
|
1198
|
+
<div class="chips">
|
|
1199
|
+
<span class="chip-s">markets</span>
|
|
1200
|
+
<span class="chip-s">memecoins</span>
|
|
1201
|
+
<span class="chip-s">NFTs</span>
|
|
1202
|
+
<span class="chip-s">rh chain</span>
|
|
1203
|
+
</div>
|
|
1204
|
+
</article>
|
|
1205
|
+
<article class="route-card p-sol">
|
|
1206
|
+
<div class="where">solana agent →</div>
|
|
1207
|
+
<h3>Solana <img src="https://icons.llamao.fi/icons/chains/rsz_solana?w=40&h=40" alt="Solana" loading="lazy"></h3>
|
|
1208
|
+
<p>Swaps, research, Jupiter routes. The bounded lane decodes every instruction and bans delegation ops outright.</p>
|
|
1209
|
+
<div class="chips">
|
|
1210
|
+
<span class="chip-s">Jupiter</span>
|
|
1211
|
+
<span class="chip-s">swaps</span>
|
|
1212
|
+
<span class="chip-s">decoded ix</span>
|
|
1213
|
+
</div>
|
|
1214
|
+
</article>
|
|
1215
|
+
<article class="route-card p-btc">
|
|
1216
|
+
<div class="where">bitcoin agent →</div>
|
|
1217
|
+
<h3>Bitcoin <img src="https://icons.llamao.fi/icons/chains/rsz_bitcoin?w=40&h=40" alt="Bitcoin" loading="lazy"></h3>
|
|
1218
|
+
<p>Ordinals, runes, and BTC research. Every PSBT input carries proven provenance, so fees are computed, not asserted.</p>
|
|
1219
|
+
<div class="chips">
|
|
1220
|
+
<span class="chip-s">ordinals</span>
|
|
1221
|
+
<span class="chip-s">runes</span>
|
|
1222
|
+
<span class="chip-s">psbt proof</span>
|
|
1223
|
+
</div>
|
|
1224
|
+
</article>
|
|
1225
|
+
<article class="route-card p-evm">
|
|
1226
|
+
<div class="where">evm / bridge agent →</div>
|
|
1227
|
+
<h3>Multi-chain EVM <img src="https://icons.llamao.fi/icons/chains/rsz_ethereum?w=40&h=40" alt="Ethereum" loading="lazy"></h3>
|
|
1228
|
+
<p>Multi-chain routes, LI.FI and Relay bridges across ETH and L2s. Bounded evm-swap and evm-bridge lanes.</p>
|
|
1229
|
+
<div class="chips">
|
|
1230
|
+
<span class="chip-s">evm-swap</span>
|
|
1231
|
+
<span class="chip-s">evm-bridge</span>
|
|
1232
|
+
<span class="chip-s">best route</span>
|
|
1233
|
+
</div>
|
|
1234
|
+
</article>
|
|
1235
|
+
<article class="route-card p-nft">
|
|
1236
|
+
<div class="where">nft agent →</div>
|
|
1237
|
+
<h3>Cross-chain NFTs <img src="../assets/protocols/opensea.png" alt="OpenSea" loading="lazy"></h3>
|
|
1238
|
+
<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>
|
|
1239
|
+
<div class="chips">
|
|
1240
|
+
<span class="chip-s">list</span>
|
|
1241
|
+
<span class="chip-s">buy</span>
|
|
1242
|
+
<span class="chip-s">floor · pnl</span>
|
|
1243
|
+
</div>
|
|
1244
|
+
</article>
|
|
1245
|
+
<article class="route-card p-stable">
|
|
1246
|
+
<div class="where">stable agent →</div>
|
|
1247
|
+
<h3>Stable <img src="https://icons.llamao.fi/icons/chains/rsz_stable?w=40&h=40" alt="Stable" loading="lazy"></h3>
|
|
1248
|
+
<p>Stable mainnet launch radar, memecoins, USDT0 gas, and venue ops, scanned straight from the chain's own logs.</p>
|
|
1249
|
+
<div class="chips">
|
|
1250
|
+
<span class="chip-s">launches</span>
|
|
1251
|
+
<span class="chip-s">memecoins</span>
|
|
1252
|
+
<span class="chip-s">USDT0 gas</span>
|
|
1253
|
+
<span class="chip-s">Stable</span>
|
|
1254
|
+
</div>
|
|
1255
|
+
</article>
|
|
1256
|
+
<article class="route-card p-build">
|
|
1257
|
+
<div class="where">protocol builder →</div>
|
|
1258
|
+
<h3>Build protocols</h3>
|
|
1259
|
+
<p>Scaffold contracts, run security gates (Foundry + static checks), prepare unsigned deploys through pinned factories. You still sign every deploy.</p>
|
|
1260
|
+
<div class="chips">
|
|
1261
|
+
<span class="chip-s">scaffold</span>
|
|
1262
|
+
<span class="chip-s">security gate</span>
|
|
1263
|
+
<span class="chip-s">unsigned deploy</span>
|
|
1264
|
+
</div>
|
|
1265
|
+
</article>
|
|
1266
|
+
</div>
|
|
1267
|
+
<div class="why-band">
|
|
1268
|
+
<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>
|
|
1269
|
+
</div>
|
|
1270
|
+
</div>
|
|
1271
|
+
|
|
1272
|
+
<div class="band-head rv">
|
|
1273
|
+
<p class="eyebrow">Custody</p>
|
|
1274
|
+
<h2>The wallet stays yours.</h2>
|
|
1275
|
+
</div>
|
|
1276
|
+
<div class="moat-grid rv" style="margin-top:28px">
|
|
1277
|
+
<article class="moat-card">
|
|
1278
|
+
<div class="n">bound grants</div>
|
|
1279
|
+
<h3>Wallet with temporary agent permission</h3>
|
|
1280
|
+
<p>Max value, chain, venue, destinations, and TTL. Outside the grant = hard refuse, not an agent with a free wallet.</p>
|
|
1281
|
+
</article>
|
|
1282
|
+
<article class="moat-card">
|
|
1283
|
+
<div class="n">bounded surfaces</div>
|
|
1284
|
+
<h3>Six lanes, each with its own decoder</h3>
|
|
1285
|
+
<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>
|
|
1286
|
+
</article>
|
|
1287
|
+
<article class="moat-card">
|
|
1288
|
+
<div class="n">evidence</div>
|
|
1289
|
+
<h3>Decoded before you sign, receipted after</h3>
|
|
1290
|
+
<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>
|
|
1291
|
+
</article>
|
|
1292
|
+
<article class="moat-card">
|
|
1293
|
+
<div class="n">fail closed</div>
|
|
1294
|
+
<h3>Unconfigured means refused</h3>
|
|
1295
|
+
<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>
|
|
1296
|
+
</article>
|
|
1297
|
+
</div>
|
|
1298
|
+
|
|
1299
|
+
<div class="strategy-surface rv" id="strategies" aria-labelledby="strategies-title">
|
|
1300
|
+
<div class="strategy-head">
|
|
1301
|
+
<div>
|
|
1302
|
+
<div class="strategy-kicker">Agentic strategies</div>
|
|
1303
|
+
<h3 id="strategies-title">Move liquidity. Bound the risk.</h3>
|
|
1304
|
+
</div>
|
|
1305
|
+
<p>Oracle reads the position, models the route and costs, then prepares only the steps the selected lane can actually support.</p>
|
|
1306
|
+
</div>
|
|
1307
|
+
<figure class="route-proof rv">
|
|
1308
|
+
<video id="route-session" width="868" height="456"
|
|
1309
|
+
poster="../assets/hero/route-session-poster.jpg"
|
|
1310
|
+
muted loop playsinline preload="none"
|
|
1311
|
+
aria-label="Recorded Oracle session pricing one swap across five venues and ranking them net of cost">
|
|
1312
|
+
<source src="../assets/hero/route-session.webm" type="video/webm">
|
|
1313
|
+
<source src="../assets/hero/route-session.mp4" type="video/mp4">
|
|
1314
|
+
</video>
|
|
1315
|
+
<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">
|
|
1316
|
+
<figcaption>one swap, five venues, ranked net of cost</figcaption>
|
|
1317
|
+
</figure>
|
|
1318
|
+
<div class="strategy-grid">
|
|
1319
|
+
<article class="strategy-card">
|
|
1320
|
+
<div class="mode">read · model · prepare</div>
|
|
1321
|
+
<h4>LP rebalancing</h4>
|
|
1322
|
+
<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>
|
|
1323
|
+
</article>
|
|
1324
|
+
<article class="strategy-card">
|
|
1325
|
+
<div class="mode">monitor · shadow · simulate</div>
|
|
1326
|
+
<h4>MEV</h4>
|
|
1327
|
+
<p>Monitor cross-venue divergence and simulate net edge after gas, slippage and lender costs. Public mode is shadow analysis, not autonomous execution.</p>
|
|
1328
|
+
</article>
|
|
1329
|
+
<article class="strategy-card">
|
|
1330
|
+
<div class="mode">simulate · policy-check</div>
|
|
1331
|
+
<h4>Flash loans</h4>
|
|
1332
|
+
<p>Build bounded atomic loan routes and test premium, calldata, gas and minimum-profit gates. Public live execution remains disabled.</p>
|
|
1333
|
+
</article>
|
|
1334
|
+
<article class="strategy-card">
|
|
1335
|
+
<div class="mode">read · quote · prepare</div>
|
|
1336
|
+
<h4>Staking</h4>
|
|
1337
|
+
<p>Compare validators, staking vaults, rewards and unlock periods, then prepare supported stake, withdraw and delegate actions for your signature.</p>
|
|
1338
|
+
</article>
|
|
1339
|
+
<article class="strategy-card">
|
|
1340
|
+
<div class="mode">discover · compare · prepare</div>
|
|
1341
|
+
<h4>Yield</h4>
|
|
1342
|
+
<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>
|
|
1343
|
+
</article>
|
|
1344
|
+
</div>
|
|
1345
|
+
<div class="strategy-posture"><b>Public posture:</b> research, simulation and unsigned preparation. MEV and flash-loan broadcast stays off; supported staking, LP and yield actions require the user wallet to sign.</div>
|
|
1346
|
+
</div>
|
|
1347
|
+
</section>
|
|
1348
|
+
|
|
1349
|
+
<section class="section protocol-atlas" id="protocols">
|
|
1350
|
+
<p class="section-label rv">Protocols</p>
|
|
1351
|
+
<h2 class="section-title rv" data-split><em>110</em> protocol entries without the list wall.</h2>
|
|
1352
|
+
<p class="section-lede rv">The old roster wall is gone from the surface. Oracle now presents the actual operator stack: read state, price routes, prepare unsigned artifacts, enforce policy, then leave the signature with you.</p>
|
|
1353
|
+
<figure class="risk-proof rv">
|
|
1354
|
+
<video id="risk-session" width="868" height="456"
|
|
1355
|
+
poster="../assets/hero/risk-session-poster.jpg"
|
|
1356
|
+
muted loop playsinline preload="none"
|
|
1357
|
+
aria-label="Recorded Oracle session running structural risk checks against a token, with a live liquidity read">
|
|
1358
|
+
<source src="../assets/hero/risk-session.webm" type="video/webm">
|
|
1359
|
+
<source src="../assets/hero/risk-session.mp4" type="video/mp4">
|
|
1360
|
+
</video>
|
|
1361
|
+
<img id="risk-still" src="../assets/hero/risk-session-poster.jpg" alt="Oracle risk check returning PASS for metadata, liquidity and sellability on a live token" width="868" height="456" loading="lazy" decoding="async">
|
|
1362
|
+
<figcaption>structural checks, live liquidity, and unknown is not pass</figcaption>
|
|
1363
|
+
</figure>
|
|
1364
|
+
<div class="motion-lab rv" aria-label="Oracle high-end operator stack">
|
|
1365
|
+
<aside class="atlas-sticky motion-command" aria-label="Oracle runtime metrics">
|
|
1366
|
+
<div class="atlas-orbit" aria-hidden="true">
|
|
1367
|
+
<div class="orbital">
|
|
1368
|
+
<svg viewBox="0 0 100 100">
|
|
1369
|
+
<g class="ring r1"><ellipse cx="50" cy="50" rx="46" ry="16"/></g>
|
|
1370
|
+
<g class="ring r2"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(60 50 50)"/></g>
|
|
1371
|
+
<g class="ring r3"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(120 50 50)"/></g>
|
|
1372
|
+
<circle class="tickring" cx="50" cy="50" r="32"/>
|
|
1373
|
+
<circle class="halo" cx="50" cy="50" r="10"/>
|
|
1374
|
+
<circle class="core" cx="50" cy="50" r="7.5"/>
|
|
1375
|
+
</svg>
|
|
1376
|
+
</div>
|
|
1377
|
+
</div>
|
|
1378
|
+
<div class="atlas-copy">
|
|
1379
|
+
<div class="atlas-count"><span id="atlas-protocol-count">110</span></div>
|
|
1380
|
+
<p class="atlas-sub">Source-backed roster stays in the runtime. The landing page shows the control system, not a grocery list.</p>
|
|
1381
|
+
<div class="atlas-ledger">
|
|
1382
|
+
<div><span>quote / route</span><b id="atlas-route-count">0</b></div>
|
|
1383
|
+
<div><span>prepare / policy</span><b id="atlas-prepare-count">0</b></div>
|
|
1384
|
+
<div><span>chains</span><b id="atlas-chain-count">12</b></div>
|
|
1385
|
+
<div><span>custody</span><b>self</b></div>
|
|
1386
|
+
</div>
|
|
1387
|
+
</div>
|
|
1388
|
+
</aside>
|
|
1389
|
+
<div class="motion-main">
|
|
1390
|
+
<div class="toolbelt" aria-label="What the operator stack does">
|
|
1391
|
+
<span>read state</span><span>price routes</span><span>prepare unsigned</span><span>enforce policy</span><span>you sign</span>
|
|
1392
|
+
</div>
|
|
1393
|
+
<div class="operator-grid" id="protocol-atlas-grid" aria-live="polite"></div>
|
|
1394
|
+
</div>
|
|
1395
|
+
</div>
|
|
1396
|
+
</section>
|
|
1397
|
+
|
|
1398
|
+
<section class="section" id="chains">
|
|
1399
|
+
<p class="section-label rv">Chains</p>
|
|
1400
|
+
<h2 class="section-title rv">Where you can <em>operate.</em></h2>
|
|
1401
|
+
<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>
|
|
1402
|
+
<div class="chain-grid" id="chain-grid"></div>
|
|
1403
|
+
<div class="hl-surface rv">
|
|
1404
|
+
<div class="venues-head"><span>hyperliquid // what oracle actually does</span></div>
|
|
1405
|
+
<div class="hl-grid">
|
|
1406
|
+
<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>
|
|
1407
|
+
<article><h3>Spot & markets</h3><p>Spot meta, mids, L2 book, candles, market and coin datapoints, leaderboards.</p></article>
|
|
1408
|
+
<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>
|
|
1409
|
+
<article><h3>Outcome markets</h3><p>HIP-4 outcome listing plus order and cancel prepare.</p></article>
|
|
1410
|
+
<article><h3>Account state</h3><p>Clearinghouse state, open orders, user fills, positions.</p></article>
|
|
1411
|
+
<article><h3>HyperEVM</h3><p>Token search and metadata on Hyperliquid, routed with the EVM lane.</p></article>
|
|
1412
|
+
</div>
|
|
1413
|
+
</div>
|
|
1414
|
+
<div class="marquee"><div class="track" id="proto-track-a"></div></div>
|
|
1415
|
+
<div class="marquee rev"><div class="track" id="proto-track-b"></div></div>
|
|
1416
|
+
<div class="proto-tiers" id="proto-tiers"></div>
|
|
1417
|
+
</div>
|
|
1418
|
+
<div class="venues rv">
|
|
1419
|
+
<div class="venues-head"><span>models // harnesses</span><span><b>bring your own model</b> · oracle is the control plane</span></div>
|
|
1420
|
+
<div class="marquee"><div class="track" id="llm-track"></div></div>
|
|
1421
|
+
</div>
|
|
1422
|
+
</section>
|
|
1423
|
+
|
|
1424
|
+
<section class="section" id="custody" style="padding-top:clamp(48px,8vh,80px)">
|
|
1425
|
+
<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(184,240,255,.05), transparent)">
|
|
1426
|
+
<div class="strip-left">
|
|
1427
|
+
<strong style="font-family:var(--display);font-weight:400;font-size:26px;display:block;margin-bottom:6px">You keep custody.</strong>
|
|
1428
|
+
<span style="font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--mute)">oracle never holds your keys</span>
|
|
1429
|
+
</div>
|
|
1430
|
+
<div class="strip-right" style="display:flex;flex-wrap:wrap;gap:10px">
|
|
1431
|
+
<span class="pill on" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid rgba(184,240,255,.35);border-radius:999px;padding:9px 12px;color:var(--blue)">Multi-wallet</span>
|
|
1432
|
+
<span class="pill on" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid rgba(184,240,255,.35);border-radius:999px;padding:9px 12px;color:var(--blue)">Per-wallet limits</span>
|
|
1433
|
+
<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>
|
|
1434
|
+
</div>
|
|
1435
|
+
</div>
|
|
1436
|
+
</section>
|
|
1437
|
+
</main>
|
|
1438
|
+
|
|
1439
|
+
<div class="mega-oracle rv" aria-hidden="true">oracle</div>
|
|
1440
|
+
<footer>
|
|
1441
|
+
<div class="foot-row">
|
|
1442
|
+
<div class="powered">
|
|
1443
|
+
powered by
|
|
1444
|
+
<a href="https://hermes-agent.nousresearch.com" target="_blank" rel="noopener noreferrer">Hermes</a>
|
|
1445
|
+
</div>
|
|
1446
|
+
<div class="foot-links">
|
|
1447
|
+
<a href="/oracle-console/">Console</a>
|
|
1448
|
+
<a href="https://hermes-agent.nousresearch.com/docs" target="_blank" rel="noopener noreferrer">Docs</a>
|
|
1449
|
+
</div>
|
|
1450
|
+
</div>
|
|
1451
|
+
<div class="foot-meta">
|
|
1452
|
+
<span>oracle · <a class="labs-link" href="https://demi.la">locals only labs</a></span>
|
|
1453
|
+
<span>self custodial // the future is agentic</span>
|
|
1454
|
+
</div>
|
|
1455
|
+
</footer>
|
|
1456
|
+
|
|
1457
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/gsap.min.js"></script>
|
|
1458
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/ScrollTrigger.min.js"></script>
|
|
1459
|
+
<script src="https://cdn.jsdelivr.net/npm/lenis@1.3.11/dist/lenis.min.js"></script>
|
|
1460
|
+
<script>
|
|
1461
|
+
(function () {
|
|
1462
|
+
"use strict";
|
|
1463
|
+
document.documentElement.classList.add("js");
|
|
1464
|
+
|
|
1465
|
+
var ICON = "https://icons.llamao.fi/icons/";
|
|
1466
|
+
var CHAINS = [
|
|
1467
|
+
{ name: "Ethereum", id: "1", logo: "chains/rsz_ethereum", note: "evm / bridge agent", badge: "route" },
|
|
1468
|
+
{ name: "Base", id: "8453", logo: "chains/rsz_base", note: "evm / bridge agent", badge: "route" },
|
|
1469
|
+
{ name: "Arbitrum", id: "42161", logo: "chains/rsz_arbitrum", note: "evm / bridge agent", badge: "route" },
|
|
1470
|
+
{ name: "Optimism", id: "10", logo: "chains/rsz_optimism", note: "evm / bridge agent", badge: "route" },
|
|
1471
|
+
{ name: "BNB Chain", id: "56", logo: "chains/rsz_binance", note: "evm / bridge agent", badge: "route" },
|
|
1472
|
+
{ name: "Avalanche", id: "43114", logo: "chains/rsz_avalanche", note: "evm / bridge agent", badge: "route" },
|
|
1473
|
+
{ name: "Polygon", id: "137", logo: "chains/rsz_polygon", note: "evm / bridge agent", badge: "route" },
|
|
1474
|
+
{ name: "Robinhood", id: "4663", logo: "chains/rsz_robinhood", note: "robinhood agent", badge: "route" },
|
|
1475
|
+
{ name: "Hyperliquid", id: "999", logo: "chains/rsz_hyperliquid", note: "hyperliquid agent", badge: "read" },
|
|
1476
|
+
{ name: "Abstract", id: "2741", logo: "chains/rsz_abstract", note: "open / add agent", badge: "read" },
|
|
1477
|
+
{ name: "Stable", id: "988", logo: "chains/rsz_stable", note: "stable agent", badge: "read" },
|
|
1478
|
+
{ name: "Solana", id: "SOL", logo: "chains/rsz_solana", note: "solana agent", badge: "route" },
|
|
1479
|
+
{ name: "Bitcoin", id: "BTC", logo: "chains/rsz_bitcoin", note: "bitcoin agent", badge: "route" }
|
|
1480
|
+
];
|
|
1481
|
+
document.getElementById("chain-grid").innerHTML = CHAINS.map(function (c) {
|
|
1482
|
+
var cls = c.badge === "route" ? "badge live" : "badge";
|
|
1483
|
+
var label = c.badge === "route" ? "route" : "read only";
|
|
1484
|
+
return '<article class="chain rv"><div class="chain-top"><div class="nm">' + c.name +
|
|
1485
|
+
' <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>';
|
|
1486
|
+
}).join("");
|
|
1487
|
+
|
|
1488
|
+
var WM = "../assets/wordmarks/";
|
|
1489
|
+
var BRAND = "../brand/";
|
|
1490
|
+
var PROTOS_A = [
|
|
1491
|
+
{ n: "Uniswap V3", wm: "uniswap.svg", cap: "read + quote + prepare + policy", u: "https://app.uniswap.org/" },
|
|
1492
|
+
{ n: "Aerodrome Slipstream", wm: "aerodrome.svg", cap: "read + quote + prepare", u: "https://aerodrome.finance/" },
|
|
1493
|
+
{ n: "Pancake V3", wm: "pancakeswap.svg", cap: "read + quote", u: "https://pancakeswap.finance/swap" },
|
|
1494
|
+
{ n: "LFJ Liquidity Book", img: "lfj", cap: "read + quote", u: "https://lfj.gg/avalanche/trade" },
|
|
1495
|
+
{ n: "Curve RouterNG", img: "curve", cap: "read + quote + prepare + policy", u: "https://curve.finance" },
|
|
1496
|
+
{ n: "Pendle Router", img: "pendle", cap: "read + quote + prepare + policy", u: "https://pendle.finance/" },
|
|
1497
|
+
{ n: "Morpho vaults", wm: "morpho.svg", cap: "read + deposit prepare", u: "https://app.morpho.org/" },
|
|
1498
|
+
{ n: "Lido stETH", img: "lido", cap: "read + stake prepare + policy", u: "https://lido.fi/" },
|
|
1499
|
+
{ n: "Kinetiq kHYPE", wm: "kinetiq.svg", tall: 1, cap: "read + quote + stake prepare + policy", u: "https://kinetiq.xyz/stake" },
|
|
1500
|
+
{ n: "Project X", img: "projectx", cap: "read", u: "https://www.prjx.com" },
|
|
1501
|
+
{ n: "Uniswap V4", img: "uniswapv4", cap: "read + quote", u: "https://app.uniswap.org/" },
|
|
1502
|
+
{ n: "Aborean CL", img: "aborean", cap: "read + quote", u: "https://aborean.finance/" },
|
|
1503
|
+
{ n: "Aborean AMM", img: "aborean", cap: "read + quote", u: "https://aborean.finance/" },
|
|
1504
|
+
{ n: "Stable Swap V3", img: "stableswap", cap: "read + quote", u: "https://swap.stable.xyz/" },
|
|
1505
|
+
{ n: "Stable Swap V2", img: "stableswap", cap: "read + quote", u: "https://swap.stable.xyz/" },
|
|
1506
|
+
{ n: "Compound V3", img: "compound", cap: "read + quote", u: "https://www.compound.xyz/" },
|
|
1507
|
+
{ n: "Aerodrome V1", img: "aerodrome", cap: "read + quote", u: "https://aerodrome.finance/" },
|
|
1508
|
+
{ n: "Ethena sUSDe", img: "ethena", cap: "read + quote", u: "https://app.ethena.fi/" },
|
|
1509
|
+
{ n: "Lido wstETH", img: "lido", cap: "read + quote", u: "https://lido.fi/" },
|
|
1510
|
+
{ n: "Benqi sAVAX", img: "benqi", cap: "read + quote", u: "https://app.benqi.fi/savax" },
|
|
1511
|
+
{ n: "EigenLayer", img: "eigenlayer", cap: "read + quote", u: "https://www.eigencloud.xyz/eigenlayer" },
|
|
1512
|
+
{ n: "SSV Network", img: "ssv", cap: "read", u: "https://ssv.network/" },
|
|
1513
|
+
{ n: "Fluid Lending", img: "fluid", cap: "read + quote", u: "https://www.fluid.io/" },
|
|
1514
|
+
{ n: "Rain", img: "rain", cap: "read + quote", u: "https://www.rain.one/" },
|
|
1515
|
+
{ n: "Derive V2", img: "derive", cap: "read", u: "https://app.derive.xyz" },
|
|
1516
|
+
{ n: "PancakeSwap AMM", img: "pancakeswap", cap: "read + quote", u: "https://pancakeswap.finance/" },
|
|
1517
|
+
{ n: "Lista Lending", img: "lista", cap: "read + quote", u: "https://lista.org/lending" },
|
|
1518
|
+
{ n: "Lista CDP", img: "lista", cap: "read", u: "https://lista.org/" },
|
|
1519
|
+
{ n: "Benqi Lending", img: "benqi", cap: "read", u: "https://benqi.fi" },
|
|
1520
|
+
{ n: "Pharaoh V3", img: "pharaoh", cap: "read + quote", u: "https://www.phar.gg/" },
|
|
1521
|
+
{ n: "Polymarket", img: "polymarket", cap: "read", u: "https://polymarket.com/" },
|
|
1522
|
+
{ n: "XSY", img: "xsy", cap: "read", u: "https://xsy.fi" },
|
|
1523
|
+
{ n: "Balancer V2", wm: "balancer.svg", cap: "read + quote", u: "https://balancer.fi/" },
|
|
1524
|
+
{ n: "Harmonix", img: "harmonix", cap: "read + quote", u: "https://app.harmonix.fi/" },
|
|
1525
|
+
{ n: "Hyperliquid HLP", wm: "hyperliquid.svg", cap: "read", u: "https://app.hyperliquid.xyz" },
|
|
1526
|
+
{ n: "stHYPE + wstHYPE", img: "sthype", cap: "read + quote", u: "https://app.valantis.xyz" },
|
|
1527
|
+
{ n: "Arcus Perps", img: "arcus", cap: "read", u: "https://arcus.xyz/" },
|
|
1528
|
+
{ n: "NOXA Fun", img: "noxa", cap: "read + quote", u: "https://fun.noxa.eth.limo/" },
|
|
1529
|
+
{ n: "Kona V2", img: "kona", cap: "read + quote", u: "https://kona.surf/" },
|
|
1530
|
+
{ n: "Kona Stableswap", img: "kona", cap: "read + quote", u: "https://kona.surf/" },
|
|
1531
|
+
{ n: "NOXA DEX V2", img: "noxa", cap: "read", u: "https://fun.noxa.eth.limo/" },
|
|
1532
|
+
{ n: "AFI Protocol", img: "afi", cap: "read + quote", u: "https://afiprotocol.xyz/" },
|
|
1533
|
+
{ n: "Kelp", img: "kelp", cap: "read + quote", u: "https://kelpdao.xyz/" },
|
|
1534
|
+
{ n: "Dolomite", img: "dolomite", cap: "read", u: "https://dolomite.io" },
|
|
1535
|
+
{ n: "Camelot V3", img: "camelot", cap: "read + quote", u: "https://camelot.exchange/" },
|
|
1536
|
+
{ n: "Beefy", img: "beefy", cap: "read + quote", u: "https://beefy.com" },
|
|
1537
|
+
{ n: "BounceBit", img: "bouncebit", cap: "read", u: "https://bouncebit.io/" },
|
|
1538
|
+
{ n: "BitFi", img: "bitfi", cap: "read", u: "https://www.bitfi.one/" },
|
|
1539
|
+
{ n: "Hypha", img: "hypha", cap: "read + quote", u: "https://www.hypha.sh/" },
|
|
1540
|
+
{ n: "40 Acres", img: "fortyacres", cap: "read + quote", u: "https://www.40acres.finance/" },
|
|
1541
|
+
{ n: "Hyperbeat", img: "hyperbeat", cap: "read + quote", u: "https://app.hyperbeat.org/" },
|
|
1542
|
+
{ n: "GMX V2", wm: "gmx.svg", cap: "read + order attestation", u: "https://gmx.io/" },
|
|
1543
|
+
{ n: "Relay", wm: "relay.svg", cap: "route source", u: "https://relay.link/" },
|
|
1544
|
+
{ n: "Odos", wm: "odos.svg", cap: "read + route source", u: "https://app.odos.xyz" },
|
|
1545
|
+
{ n: "Jupiter", wm: "jupiter.svg", cap: "solana route source", u: "https://jup.ag/" },
|
|
1546
|
+
{ n: "Stargate", wm: "stargate.svg", cap: "read + bridge route", u: "https://stargate.finance/" }
|
|
1547
|
+
];
|
|
1548
|
+
var PROTOS_B = [
|
|
1549
|
+
{ n: "Uniswap V3 LP", img: "uniswap", cap: "preview + mint/collect prepare", u: "https://app.uniswap.org/" },
|
|
1550
|
+
{ n: "Velodrome V2", wm: "velodrome.svg", cap: "read + quote", u: "https://velodrome.finance/" },
|
|
1551
|
+
{ n: "QuickSwap", img: "quickswap", cap: "read + quote", u: "https://quickswap.exchange/" },
|
|
1552
|
+
{ n: "HyperSwap V3", wm: "hyperswap.svg", cap: "read + quote", u: "https://app.hyperswap.exchange/" },
|
|
1553
|
+
{ n: "Balancer V3", img: "balancer", cap: "read + quote + prepare + policy", u: "https://balancer.fi/" },
|
|
1554
|
+
{ n: "Aave V3", img: "aave", cap: "read + supply/withdraw prepare + policy", u: "https://aave.com/" },
|
|
1555
|
+
{ n: "Morpho Blue", img: "morpho", cap: "read", u: "https://app.morpho.org" },
|
|
1556
|
+
{ n: "Concrete", img: "concrete", cap: "read + quote", u: "https://app.concrete.xyz" },
|
|
1557
|
+
{ n: "HyperLend", img: "hyperlend", cap: "read + supply/withdraw prepare + policy", u: "https://app.hyperlend.finance/" },
|
|
1558
|
+
{ n: "Kinetiq Earn", img: "kinetiq", cap: "read + quote", u: "https://kinetiq.xyz/stake-hype#kinetiq-earn" },
|
|
1559
|
+
{ n: "Kona Lend", img: "konalend", cap: "read + supply/withdraw prepare + policy", u: "https://app.kona.surf/lending" },
|
|
1560
|
+
{ n: "Uniswap V2", img: "uniswapv2", cap: "read + quote", u: "https://app.uniswap.org/" },
|
|
1561
|
+
{ n: "SakuraSwap AMM", img: "sakuraswap", cap: "read + quote", u: "https://sakuraswap.com/" },
|
|
1562
|
+
{ n: "SakuraSwap CLMM", img: "sakuraswap", cap: "read + quote", u: "https://sakuraswap.com/" },
|
|
1563
|
+
{ n: "Curve DEX", img: "curve", cap: "read + quote", u: "https://curve.finance" },
|
|
1564
|
+
{ n: "Aave V2", img: "aavev2", cap: "read + quote", u: "https://aave.com" },
|
|
1565
|
+
{ n: "Velodrome Slipstream", img: "velodrome", cap: "read + quote", u: "https://velodrome.finance/" },
|
|
1566
|
+
{ n: "Sky sUSDS", img: "sky", cap: "read + quote", u: "https://app.sky.money/" },
|
|
1567
|
+
{ n: "ether.fi weETH", img: "etherfi", cap: "read + quote", u: "https://www.ether.fi/" },
|
|
1568
|
+
{ n: "SparkLend", img: "spark", cap: "read + supply/withdraw prepare + policy", u: "https://spark.finance/" },
|
|
1569
|
+
{ n: "Binance wBETH", img: "wbeth", cap: "read + quote", u: "https://www.binance.com/en/wbeth" },
|
|
1570
|
+
{ n: "Spark Savings", img: "sparksavings", cap: "read + quote", u: "https://spark.finance/" },
|
|
1571
|
+
{ n: "Fluid DEX", img: "fluid", cap: "read + quote", u: "https://www.fluid.io/" },
|
|
1572
|
+
{ n: "ZEROBASE", img: "zerobase", cap: "read", u: "https://app.zerobase.pro/" },
|
|
1573
|
+
{ n: "EtherFi Cash", img: "etherfiborrow", cap: "read", u: "https://www.ether.fi/cash" },
|
|
1574
|
+
{ n: "Venus", img: "venus", cap: "read + quote", u: "https://app.venus.io/" },
|
|
1575
|
+
{ n: "Lista slisBNB", img: "lista", cap: "read + quote", u: "https://lista.org/" },
|
|
1576
|
+
{ n: "Solv", img: "solv", cap: "read + quote", u: "https://solv.finance/" },
|
|
1577
|
+
{ n: "Avant avUSD", img: "avant", cap: "read + quote", u: "https://app.avantprotocol.com/" },
|
|
1578
|
+
{ n: "Yield Yak", img: "yieldyak", cap: "read + quote", u: "https://yieldyak.com/" },
|
|
1579
|
+
{ n: "SushiSwap", img: "sushiswap", cap: "read + quote", u: "https://sushi.com/" },
|
|
1580
|
+
{ n: "Sphere", img: "sphere", cap: "read", u: "https://sphere.finance/" },
|
|
1581
|
+
{ n: "Felix", img: "felix", cap: "read + quote", u: "https://www.usefelix.xyz/" },
|
|
1582
|
+
{ n: "Unit", img: "unit", cap: "read", u: "https://hyperunit.xyz/" },
|
|
1583
|
+
{ n: "Hyperliquid Spot", img: "hyperliquidspot", cap: "read + quote", u: "https://app.hyperliquid.xyz/" },
|
|
1584
|
+
{ n: "Kinetiq kmHYPE", img: "kmhype", cap: "read + quote", u: "https://markets.xyz" },
|
|
1585
|
+
{ n: "Lighter Robinhood", img: "lighter", cap: "read", u: "https://robinhoodchain.lighter.xyz/trade/LIT" },
|
|
1586
|
+
{ n: "Ekubo", img: "ekubo", cap: "read", u: "https://ekubo.org/" },
|
|
1587
|
+
{ n: "Myriad Markets", img: "myriad", cap: "read + quote", u: "https://myriad.markets/markets" },
|
|
1588
|
+
{ n: "GASSSS", img: "gassss", cap: "read + quote", u: "https://gassss.xyz" },
|
|
1589
|
+
{ n: "Rocket Pool", img: "rocketpool", cap: "read + quote", u: "https://rocketpool.net" },
|
|
1590
|
+
{ n: "StakeWise V2", img: "stakewise", cap: "read + quote", u: "https://stakewise.io/" },
|
|
1591
|
+
{ n: "Ostium", img: "ostium", cap: "read + quote", u: "https://www.ostium.io/" },
|
|
1592
|
+
{ n: "Gains Network", img: "gainsnetwork", cap: "read + quote", u: "https://gains.trade/" },
|
|
1593
|
+
{ n: "Aster asBNB", img: "aster", cap: "read + quote", u: "https://www.asterdex.com/en/earn" },
|
|
1594
|
+
{ n: "Lorenzo", img: "lorenzo", cap: "read", u: "https://www.lorenzo-protocol.xyz/" },
|
|
1595
|
+
{ n: "Trader Joe", img: "joedex", cap: "read + quote", u: "https://lfj.gg/avalanche" },
|
|
1596
|
+
{ n: "Folks Finance", img: "folks", cap: "read", u: "https://folks.finance/" },
|
|
1597
|
+
{ n: "Velodrome V1", img: "velodrome", cap: "read + quote", u: "https://velodrome.finance/" },
|
|
1598
|
+
{ n: "Looped Hype", img: "loopedhype", cap: "read + quote", u: "https://www.loopingcollective.org/" },
|
|
1599
|
+
{ n: "LI.FI", img: "lifi", cap: "read + route source", u: "https://li.fi/" },
|
|
1600
|
+
{ n: "Velora", img: "velora", cap: "read + route source", u: "https://app.velora.xyz" },
|
|
1601
|
+
{ n: "CoW Swap", wm: "cowswap.svg", cap: "read + route source", u: "https://cow.fi/" },
|
|
1602
|
+
{ n: "Across", wm: "across.svg", cap: "read + bridge route", u: "https://across.to" }
|
|
1603
|
+
];
|
|
1604
|
+
|
|
1605
|
+
// Equalize optical weight: constant target area, clamped, then width-capped.
|
|
1606
|
+
function normalizeMark(img) {
|
|
1607
|
+
var ar = img.naturalWidth / img.naturalHeight;
|
|
1608
|
+
if (!isFinite(ar) || ar <= 0) return;
|
|
1609
|
+
var h = Math.sqrt(2600 / ar);
|
|
1610
|
+
h = Math.max(22, Math.min(34, h));
|
|
1611
|
+
if (h * ar > 170) h = 170 / ar;
|
|
1612
|
+
img.style.height = h.toFixed(1) + "px";
|
|
1613
|
+
}
|
|
1614
|
+
function wireMarks(root) {
|
|
1615
|
+
if (!root) return;
|
|
1616
|
+
root.querySelectorAll("img.wm").forEach(function (img) {
|
|
1617
|
+
if (img.complete) {
|
|
1618
|
+
if (!img.classList.contains("tall") && img.naturalWidth) normalizeMark(img);
|
|
1619
|
+
return;
|
|
1620
|
+
}
|
|
1621
|
+
img.addEventListener("load", function () {
|
|
1622
|
+
if (!img.classList.contains("tall")) normalizeMark(img);
|
|
1623
|
+
syncMarqueeVelocity();
|
|
1624
|
+
}, { once: true });
|
|
1625
|
+
});
|
|
1626
|
+
}
|
|
1627
|
+
|
|
1628
|
+
var MARQUEE_PX_PER_SECOND = 20;
|
|
1629
|
+
var marqueeResizeTimer = 0;
|
|
1630
|
+
function syncMarqueeVelocity() {
|
|
1631
|
+
document.querySelectorAll(".track").forEach(function (track) {
|
|
1632
|
+
var distance = track.scrollWidth / 2;
|
|
1633
|
+
if (distance > 0) {
|
|
1634
|
+
track.style.setProperty("--marquee-duration", Math.max(30, distance / MARQUEE_PX_PER_SECOND).toFixed(2) + "s");
|
|
1635
|
+
}
|
|
1636
|
+
});
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
function protocolName(name) {
|
|
1640
|
+
var label = name.replace(/\s+(?:DEX\s+)?V\d+(?:\s+LP)?\b/gi, "").trim();
|
|
1641
|
+
var aliases = [
|
|
1642
|
+
[/^Aerodrome\b/i, "Aerodrome"],
|
|
1643
|
+
[/^Pancake(?:Swap)?\b/i, "PancakeSwap"],
|
|
1644
|
+
[/^LFJ\b/i, "LFJ"],
|
|
1645
|
+
[/^Curve\b/i, "Curve"],
|
|
1646
|
+
[/^Pendle\b/i, "Pendle"],
|
|
1647
|
+
[/^Morpho\b/i, "Morpho"],
|
|
1648
|
+
[/^Lido\b/i, "Lido"],
|
|
1649
|
+
[/^Kinetiq\b/i, "Kinetiq"],
|
|
1650
|
+
[/^Aborean\b/i, "Aborean"],
|
|
1651
|
+
[/^Stable Swap\b/i, "Stable"],
|
|
1652
|
+
[/^Ethena\b/i, "Ethena"],
|
|
1653
|
+
[/^Benqi\b/i, "Benqi"],
|
|
1654
|
+
[/^Fluid\b/i, "Fluid"],
|
|
1655
|
+
[/^Lista\b/i, "Lista"],
|
|
1656
|
+
[/^Hyperliquid\b/i, "Hyperliquid"],
|
|
1657
|
+
[/^Arcus\b/i, "Arcus"],
|
|
1658
|
+
[/^NOXA\b/i, "NOXA"],
|
|
1659
|
+
[/^Kona\b/i, "Kona"],
|
|
1660
|
+
[/^Velodrome\b/i, "Velodrome"],
|
|
1661
|
+
[/^SakuraSwap\b/i, "SakuraSwap"],
|
|
1662
|
+
[/^Spark(?:Lend|\b)/i, "Spark"],
|
|
1663
|
+
[/^(?:ether\.fi|EtherFi)\b/i, "EtherFi"],
|
|
1664
|
+
[/^Sky\b/i, "Sky"],
|
|
1665
|
+
[/^Binance\b/i, "Binance"],
|
|
1666
|
+
[/^Avant\b/i, "Avant"],
|
|
1667
|
+
[/^Aster\b/i, "Aster"],
|
|
1668
|
+
[/^Lighter\b/i, "Lighter"],
|
|
1669
|
+
[/^stHYPE \+ wstHYPE$/i, "Valantis"]
|
|
1670
|
+
];
|
|
1671
|
+
for (var i = 0; i < aliases.length; i++) {
|
|
1672
|
+
if (aliases[i][0].test(label)) return aliases[i][1];
|
|
1673
|
+
}
|
|
1674
|
+
return label;
|
|
1675
|
+
}
|
|
1676
|
+
function uniqueProtocols(list, seen) {
|
|
1677
|
+
return list.filter(function (x) {
|
|
1678
|
+
var label = protocolName(x.n);
|
|
1679
|
+
if (seen[label]) return false;
|
|
1680
|
+
seen[label] = true;
|
|
1681
|
+
return true;
|
|
1682
|
+
});
|
|
1683
|
+
}
|
|
1684
|
+
function chipRow(list) {
|
|
1685
|
+
var seq = list.concat(list);
|
|
1686
|
+
return seq.map(function (x) {
|
|
1687
|
+
var label = protocolName(x.n);
|
|
1688
|
+
var body = x.img
|
|
1689
|
+
? '<img class="wm tall" src="' + BRAND + x.img + '.webp" alt="' + label + '" decoding="async">' +
|
|
1690
|
+
'<span class="wordmark">' + label + '</span>'
|
|
1691
|
+
: x.wm
|
|
1692
|
+
? '<img class="' + (x.tall ? 'wm tall' : 'wm') + (x.mono ? ' mono' : '') + '" src="' + WM + x.wm + '" alt="' + label + '" decoding="async">' +
|
|
1693
|
+
(x.tall ? '<span class="wordmark">' + label + '</span>' : '')
|
|
1694
|
+
: '<span class="wordmark">' + label + '</span>';
|
|
1695
|
+
return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + label + '">' + body + '</a>';
|
|
1696
|
+
}).join("");
|
|
1697
|
+
}
|
|
1698
|
+
var visibleProtocols = Object.create(null);
|
|
1699
|
+
// Grouped by what Oracle can actually DO with each protocol, instead of one
|
|
1700
|
+
// undifferentiated scrolling wall. The capability strings are the source of
|
|
1701
|
+
// truth -- nothing here is hand-assigned.
|
|
1702
|
+
function capTier(cap) {
|
|
1703
|
+
if (/prepare|attestation/.test(cap)) return "prepare";
|
|
1704
|
+
if (/quote|route source/.test(cap)) return "quote";
|
|
1705
|
+
return "read";
|
|
1706
|
+
}
|
|
1707
|
+
var TIER_COPY = {
|
|
1708
|
+
prepare: { n: "Prepare", h: "Signed by you, built by Oracle",
|
|
1709
|
+
p: "Oracle builds the unsigned transaction: decoded calldata, minOut, spender and policy checks. Your wallet is the only thing that can broadcast it." },
|
|
1710
|
+
quote: { n: "Quote", h: "Priced live, ranked net of cost",
|
|
1711
|
+
p: "Real quotes pulled at request time and compared after gas and slippage, so the winning venue is measured rather than preferred." },
|
|
1712
|
+
read: { n: "Read", h: "State, positions and markets",
|
|
1713
|
+
p: "Balances, pools, positions, rates and market data read straight from the chain or the protocol's own API." }
|
|
1714
|
+
};
|
|
1715
|
+
(function () {
|
|
1716
|
+
// Marquee first: it is the BREADTH signal (every brand, moving). The tiers
|
|
1717
|
+
// below are the DEPTH signal. Note the dedupe scopes are deliberately
|
|
1718
|
+
// different -- brand-level here (one Uniswap mark, not four), full-entry-name
|
|
1719
|
+
// in the tiers so Uniswap V3 and V4 stay visible as separate integrations.
|
|
1720
|
+
// Reusing visibleProtocols here would filter every chip out, because the tier
|
|
1721
|
+
// pass fills it with all 110 entries.
|
|
1722
|
+
var marqueeSeen = Object.create(null);
|
|
1723
|
+
var trackA = document.getElementById("proto-track-a");
|
|
1724
|
+
var trackB = document.getElementById("proto-track-b");
|
|
1725
|
+
if (trackA) trackA.innerHTML = chipRow(uniqueProtocols(PROTOS_A, marqueeSeen));
|
|
1726
|
+
if (trackB) trackB.innerHTML = chipRow(uniqueProtocols(PROTOS_B, marqueeSeen));
|
|
1727
|
+
wireMarks(trackA);
|
|
1728
|
+
wireMarks(trackB);
|
|
1729
|
+
|
|
1730
|
+
// Collapse duplicates by display label, but keep the HIGHEST capability seen
|
|
1731
|
+
// for that label. Uniswap V3 (quote) + Uniswap V3 LP (prepare) is one chip,
|
|
1732
|
+
// and it belongs in prepare -- taking whichever appeared first would understate
|
|
1733
|
+
// what Oracle can do with it.
|
|
1734
|
+
// Key on the FULL entry name, not the brand label. Uniswap V3 and Uniswap V4
|
|
1735
|
+
// are separate integrations with separate capability, and collapsing them to
|
|
1736
|
+
// "Uniswap" hides work and misreports the tier. Only exact-name repeats
|
|
1737
|
+
// between the two source lists are merged, keeping the higher capability.
|
|
1738
|
+
var RANK = { read: 0, quote: 1, prepare: 2 };
|
|
1739
|
+
var best = Object.create(null);
|
|
1740
|
+
PROTOS_A.concat(PROTOS_B).forEach(function (x) {
|
|
1741
|
+
var key = x.n;
|
|
1742
|
+
var t = capTier(x.cap || "");
|
|
1743
|
+
if (!best[key] || RANK[t] > RANK[best[key].tier]) best[key] = { item: x, tier: t };
|
|
1744
|
+
visibleProtocols[protocolName(x.n)] = true;
|
|
1745
|
+
});
|
|
1746
|
+
var groups = { prepare: [], quote: [], read: [] };
|
|
1747
|
+
Object.keys(best).forEach(function (label) {
|
|
1748
|
+
groups[best[label].tier].push(best[label].item);
|
|
1749
|
+
});
|
|
1750
|
+
var host = document.getElementById("proto-tiers");
|
|
1751
|
+
if (!host) return;
|
|
1752
|
+
host.innerHTML = ["prepare", "quote", "read"].map(function (key) {
|
|
1753
|
+
var list = groups[key];
|
|
1754
|
+
if (!list.length) return "";
|
|
1755
|
+
var c = TIER_COPY[key];
|
|
1756
|
+
var logos = list.map(function (x) {
|
|
1757
|
+
var label = x.n;
|
|
1758
|
+
var mark = x.img
|
|
1759
|
+
? '<img src="' + BRAND + x.img + '.webp" alt="" decoding="async" loading="lazy">'
|
|
1760
|
+
: x.wm
|
|
1761
|
+
? '<img src="' + WM + x.wm + '" alt="" decoding="async" loading="lazy">'
|
|
1762
|
+
: "";
|
|
1763
|
+
return '<a class="plogo" href="' + x.u + '" target="_blank" rel="noopener noreferrer">' +
|
|
1764
|
+
mark + '<span>' + label + '</span></a>';
|
|
1765
|
+
}).join("");
|
|
1766
|
+
return '<div class="ptier">' +
|
|
1767
|
+
'<div class="ptier-h"><span class="ptier-n">' + c.n + ' / ' + list.length + ' protocols</span>' +
|
|
1768
|
+
'<h3>' + c.h + '</h3><p>' + c.p + '</p></div>' +
|
|
1769
|
+
'<div class="ptier-logos">' + logos + '</div></div>';
|
|
1770
|
+
}).join("");
|
|
1771
|
+
})();
|
|
1772
|
+
|
|
1773
|
+
function exactProtocolEntries() {
|
|
1774
|
+
var out = [];
|
|
1775
|
+
var seen = Object.create(null);
|
|
1776
|
+
PROTOS_A.concat(PROTOS_B).forEach(function (x) {
|
|
1777
|
+
var key = String(x.n).toLowerCase();
|
|
1778
|
+
if (seen[key]) return;
|
|
1779
|
+
seen[key] = true;
|
|
1780
|
+
out.push(x);
|
|
1781
|
+
});
|
|
1782
|
+
return out;
|
|
1783
|
+
}
|
|
1784
|
+
function renderProtocolAtlas() {
|
|
1785
|
+
var root = document.getElementById("protocol-atlas-grid");
|
|
1786
|
+
var entries = exactProtocolEntries();
|
|
1787
|
+
var routeCount = entries.filter(function (x) { return /quote|route|bridge/i.test(x.cap); }).length;
|
|
1788
|
+
var prepareCount = entries.filter(function (x) { return /prepare|policy|mint|collect|supply|withdraw|stake/i.test(x.cap); }).length;
|
|
1789
|
+
["atlas-protocol-count", "hero-protocol-count"].forEach(function (id) { var el = document.getElementById(id); if (el) el.textContent = String(entries.length); });
|
|
1790
|
+
["atlas-chain-count", "hero-chain-count"].forEach(function (id) { var el = document.getElementById(id); if (el) el.textContent = String(CHAINS.length); });
|
|
1791
|
+
var r = document.getElementById("atlas-route-count"); if (r) r.textContent = String(routeCount);
|
|
1792
|
+
var pr = document.getElementById("atlas-prepare-count"); if (pr) pr.textContent = String(prepareCount);
|
|
1793
|
+
if (!root) return;
|
|
1794
|
+
var cards = [
|
|
1795
|
+
["01", "State engine", "Portfolio, markets, positions, pools, NFTs, ordinals and venue state pulled before any action is proposed.", String(entries.length) + " sources"],
|
|
1796
|
+
["02", "Route brain", "Quotes and bridges normalize into comparable intents, with slippage, destination and calldata shape surfaced before signing.", routeCount + " route-capable"],
|
|
1797
|
+
["03", "Policy wall", "Every value-moving path passes local bounds: chain, spender, destination, amount, TTL and simulation posture.", prepareCount + " prepare paths"],
|
|
1798
|
+
["04", "Wallet handoff", "Oracle prepares. Your wallet signs. Broadcast lives behind owner auth, armed state and receipts.", "self custody"],
|
|
1799
|
+
["05", "Agent mesh", "Hyperliquid, Polymarket, Solana, Bitcoin, EVM, Stable, Robinhood Chain and protocol builder profiles stay separate.", CHAINS.length + " lanes"],
|
|
1800
|
+
["06", "Builder layer", "New contracts, route modules and chain-specific scaffolds get generated with checks before deployment ever reaches a wallet.", "extendable"]
|
|
1801
|
+
];
|
|
1802
|
+
root.innerHTML = cards.map(function (x) {
|
|
1803
|
+
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>';
|
|
1804
|
+
}).join("");
|
|
1805
|
+
}
|
|
1806
|
+
renderProtocolAtlas();
|
|
1807
|
+
|
|
1808
|
+
|
|
1809
|
+
var LM = "../assets/llms/";
|
|
1810
|
+
var LLMS = [
|
|
1811
|
+
{ n: "Hermes Agent", wm: "hermes.png", tall: 1, u: "https://hermes.nousresearch.com" },
|
|
1812
|
+
{ n: "Claude", wm: "claude.svg", u: "https://claude.ai" },
|
|
1813
|
+
{ n: "Grok", wm: "grok.svg", u: "https://grok.com" },
|
|
1814
|
+
{ n: "Codex", wm: "codex-icon.svg", tall: 1, u: "https://openai.com/codex" },
|
|
1815
|
+
{ n: "Gemini", wm: "gemini-icon.svg", tall: 1, u: "https://gemini.google.com" },
|
|
1816
|
+
{ n: "OpenClaw", wm: "openclaw.svg", tall: 1, u: "https://openclaw.ai" },
|
|
1817
|
+
{ n: "Perplexity", wm: "perplexity.svg", u: "https://perplexity.ai" },
|
|
1818
|
+
{ n: "Manus", wm: "manus.svg", u: "https://manus.im" },
|
|
1819
|
+
{ n: "Cursor", wm: "cursor-icon.svg", tall: 1, u: "https://cursor.com" },
|
|
1820
|
+
{ n: "Windsurf", wm: "windsurf.svg", u: "https://windsurf.com" },
|
|
1821
|
+
{ n: "DeepSeek", wm: "deepseek.svg", u: "https://deepseek.com" },
|
|
1822
|
+
{ n: "Qwen", wm: "qwen.svg", tall: 1, u: "https://chat.qwen.ai" },
|
|
1823
|
+
{ n: "Kimi", wm: "kimi-icon.svg", tall: 1, u: "https://kimi.com" }
|
|
1824
|
+
];
|
|
1825
|
+
document.getElementById("llm-track").innerHTML = LLMS.concat(LLMS).map(function (x) {
|
|
1826
|
+
var cls = x.tall ? "wm tall" : "wm";
|
|
1827
|
+
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>';
|
|
1828
|
+
}).join("");
|
|
1829
|
+
|
|
1830
|
+
wireMarks(document.getElementById("llm-track"));
|
|
1831
|
+
syncMarqueeVelocity();
|
|
1832
|
+
if (document.fonts && document.fonts.ready) document.fonts.ready.then(syncMarqueeVelocity);
|
|
1833
|
+
window.addEventListener("load", syncMarqueeVelocity);
|
|
1834
|
+
window.addEventListener("resize", function () {
|
|
1835
|
+
clearTimeout(marqueeResizeTimer);
|
|
1836
|
+
marqueeResizeTimer = setTimeout(syncMarqueeVelocity, 120);
|
|
1837
|
+
});
|
|
1838
|
+
|
|
1839
|
+
var loader = document.getElementById("loader");
|
|
1840
|
+
var fill = document.getElementById("loader-fill");
|
|
1841
|
+
requestAnimationFrame(function () { fill.style.width = "100%"; });
|
|
1842
|
+
window.addEventListener("load", function () {
|
|
1843
|
+
setTimeout(function () { loader.classList.add("out"); }, 650);
|
|
1844
|
+
});
|
|
1845
|
+
|
|
1846
|
+
var reduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
1847
|
+
var coarse = window.matchMedia("(pointer: coarse)").matches;
|
|
1848
|
+
var activeLenis = null;
|
|
1849
|
+
|
|
1850
|
+
|
|
1851
|
+
if (!reduced && !coarse) {
|
|
1852
|
+
document.querySelectorAll(".home-stat,.motion-card").forEach(function (card) {
|
|
1853
|
+
card.addEventListener("pointermove", function (ev) {
|
|
1854
|
+
var r = card.getBoundingClientRect();
|
|
1855
|
+
var x = (ev.clientX - r.left) / r.width;
|
|
1856
|
+
var y = (ev.clientY - r.top) / r.height;
|
|
1857
|
+
card.style.setProperty("--mx", (x * 100).toFixed(2) + "%");
|
|
1858
|
+
card.style.setProperty("--my", (y * 100).toFixed(2) + "%");
|
|
1859
|
+
if (card.classList.contains("motion-card")) {
|
|
1860
|
+
card.classList.add("is-hot");
|
|
1861
|
+
card.style.transform = "rotateX(" + ((.5 - y) * 5).toFixed(2) + "deg) rotateY(" + ((x - .5) * 7).toFixed(2) + "deg) translateY(-3px)";
|
|
1862
|
+
}
|
|
1863
|
+
});
|
|
1864
|
+
card.addEventListener("pointerleave", function () {
|
|
1865
|
+
if (!card.classList.contains("motion-card")) return;
|
|
1866
|
+
card.classList.remove("is-hot");
|
|
1867
|
+
card.style.transform = "";
|
|
1868
|
+
});
|
|
1869
|
+
});
|
|
1870
|
+
}
|
|
1871
|
+
|
|
1872
|
+
var progress = document.getElementById("progress");
|
|
1873
|
+
var ticking = false;
|
|
1874
|
+
function onScroll() {
|
|
1875
|
+
if (ticking) return;
|
|
1876
|
+
ticking = true;
|
|
1877
|
+
requestAnimationFrame(function () {
|
|
1878
|
+
var h = document.scrollingElement || document.documentElement;
|
|
1879
|
+
var max = h.scrollHeight - h.clientHeight;
|
|
1880
|
+
progress.style.transform = "scaleX(" + (max > 0 ? h.scrollTop / max : 0) + ")";
|
|
1881
|
+
ticking = false;
|
|
1882
|
+
});
|
|
1883
|
+
}
|
|
1884
|
+
window.addEventListener("scroll", onScroll, { passive: true });
|
|
1885
|
+
onScroll();
|
|
1886
|
+
|
|
1887
|
+
var heroOrb = document.getElementById("hero-orb");
|
|
1888
|
+
var heroTitle = document.getElementById("hero-title");
|
|
1889
|
+
if (heroOrb && heroTitle && !reduced) {
|
|
1890
|
+
var px = false;
|
|
1891
|
+
window.addEventListener("scroll", function () {
|
|
1892
|
+
if (px) return;
|
|
1893
|
+
px = true;
|
|
1894
|
+
requestAnimationFrame(function () {
|
|
1895
|
+
var y = window.scrollY;
|
|
1896
|
+
var lim = window.innerHeight * .8;
|
|
1897
|
+
var f = Math.min(y / lim, 1);
|
|
1898
|
+
var art = heroOrb.parentElement;
|
|
1899
|
+
art.style.opacity = String(1 - f);
|
|
1900
|
+
art.style.visibility = f >= 1 ? "hidden" : "visible";
|
|
1901
|
+
art.style.transform = "translateY(" + (Math.min(y, lim) * .28) + "px)";
|
|
1902
|
+
heroTitle.style.transform = "translateY(" + (Math.min(y, lim) * .16) + "px)";
|
|
1903
|
+
heroTitle.style.opacity = String(1 - f * .8);
|
|
1904
|
+
px = false;
|
|
1905
|
+
});
|
|
1906
|
+
}, { passive: true });
|
|
1907
|
+
}
|
|
1908
|
+
|
|
1909
|
+
// Hero is the original CSS orb.
|
|
1910
|
+
|
|
1911
|
+
var nodes = Array.prototype.slice.call(document.querySelectorAll(".rv, .wires"));
|
|
1912
|
+
if (reduced || !("IntersectionObserver" in window)) {
|
|
1913
|
+
nodes.forEach(function (n) { n.classList.add("in"); n.classList.add("done"); });
|
|
1914
|
+
} else {
|
|
1915
|
+
var io = new IntersectionObserver(function (entries) {
|
|
1916
|
+
entries.forEach(function (e) {
|
|
1917
|
+
if (e.isIntersecting) {
|
|
1918
|
+
e.target.classList.add("in");
|
|
1919
|
+
(function (el) { setTimeout(function () { el.classList.add("done"); }, 1100); })(e.target);
|
|
1920
|
+
io.unobserve(e.target);
|
|
1921
|
+
}
|
|
1922
|
+
});
|
|
1923
|
+
}, { threshold: 0.01, rootMargin: "0px 0px -2% 0px" });
|
|
1924
|
+
nodes.forEach(function (n) { io.observe(n); });
|
|
1925
|
+
setTimeout(function () {
|
|
1926
|
+
nodes.forEach(function (n) { n.classList.add("in"); n.classList.add("done"); });
|
|
1927
|
+
}, 2600);
|
|
1928
|
+
}
|
|
1929
|
+
|
|
1930
|
+
function splitWords(root) {
|
|
1931
|
+
root.querySelectorAll("[data-split]").forEach(function (el) {
|
|
1932
|
+
if (el.dataset.splitDone) return;
|
|
1933
|
+
el.dataset.splitDone = "1";
|
|
1934
|
+
el.innerHTML = el.textContent.split(/(\s+)/).map(function (w) {
|
|
1935
|
+
if (/^\s+$/.test(w)) return w;
|
|
1936
|
+
return '<span class="word-mask"><span>' + w + '</span></span>';
|
|
1937
|
+
}).join("");
|
|
1938
|
+
});
|
|
1939
|
+
}
|
|
1940
|
+
function initPremiumMotion() {
|
|
1941
|
+
if (reduced || coarse || !window.gsap) return;
|
|
1942
|
+
var gsap = window.gsap;
|
|
1943
|
+
if (window.ScrollTrigger) gsap.registerPlugin(window.ScrollTrigger);
|
|
1944
|
+
var LenisCtor = typeof window.Lenis === "function" ? window.Lenis : (window.Lenis && window.Lenis.Lenis);
|
|
1945
|
+
if (LenisCtor && window.ScrollTrigger) {
|
|
1946
|
+
activeLenis = new LenisCtor({ lerp:.08, smoothWheel:true, wheelMultiplier:.86 });
|
|
1947
|
+
activeLenis.on("scroll", window.ScrollTrigger.update);
|
|
1948
|
+
gsap.ticker.add(function (time) { activeLenis.raf(time * 1000); });
|
|
1949
|
+
gsap.ticker.lagSmoothing(0);
|
|
1950
|
+
}
|
|
1951
|
+
splitWords(document);
|
|
1952
|
+
if (window.ScrollTrigger) {
|
|
1953
|
+
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" });
|
|
1954
|
+
gsap.to(".hero-art", { yPercent:18, scale:.9, ease:"none", scrollTrigger:{ trigger:".home", start:"top top", end:"bottom top", scrub:true } });
|
|
1955
|
+
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" });
|
|
1956
|
+
gsap.to(".motion-command", { y:-34, rotateX:3, ease:"none", scrollTrigger:{ trigger:".motion-lab", start:"top 70%", end:"bottom top", scrub:true } });
|
|
1957
|
+
gsap.to(".mega-oracle", { xPercent:-8, ease:"none", scrollTrigger:{ trigger:".mega-oracle", start:"top bottom", end:"bottom top", scrub:true } });
|
|
1958
|
+
}
|
|
1959
|
+
document.documentElement.classList.add("premium-motion");
|
|
1960
|
+
}
|
|
1961
|
+
initPremiumMotion();
|
|
1962
|
+
|
|
1963
|
+
function scrollToHash(hash) {
|
|
1964
|
+
var target = document.getElementById(hash.slice(1));
|
|
1965
|
+
if (!target) return false;
|
|
1966
|
+
var top = target.getBoundingClientRect().top + (document.scrollingElement || document.documentElement).scrollTop - 88;
|
|
1967
|
+
if (activeLenis && activeLenis.scrollTo) activeLenis.scrollTo(top, { duration: 1.05, easing: function (t) { return 1 - Math.pow(1 - t, 4); } });
|
|
1968
|
+
else window.scrollTo({ top: top, behavior: reduced ? "auto" : "smooth" });
|
|
1969
|
+
return true;
|
|
1970
|
+
}
|
|
1971
|
+
document.querySelectorAll('a[href^="#"]').forEach(function (a) {
|
|
1972
|
+
a.addEventListener("click", function (ev) {
|
|
1973
|
+
var hash = a.getAttribute("href");
|
|
1974
|
+
if (!hash || hash === "#") return;
|
|
1975
|
+
if (scrollToHash(hash)) {
|
|
1976
|
+
ev.preventDefault();
|
|
1977
|
+
history.replaceState(null, "", hash);
|
|
1978
|
+
}
|
|
1979
|
+
});
|
|
1980
|
+
});
|
|
1981
|
+
if (location.hash) setTimeout(function () { scrollToHash(location.hash); }, 60);
|
|
1982
|
+
|
|
1983
|
+
var canvas = document.getElementById("gl");
|
|
1984
|
+
if (!canvas || reduced || coarse) return;
|
|
1985
|
+
var gl = canvas.getContext("webgl", { antialias:false, alpha:false, depth:false, stencil:false, premultipliedAlpha:false });
|
|
1986
|
+
if (!gl) return;
|
|
1987
|
+
|
|
1988
|
+
var vs = "attribute vec2 p;void main(){gl_Position=vec4(p,0.,1.);}";
|
|
1989
|
+
var fs = [
|
|
1990
|
+
"precision highp float;",
|
|
1991
|
+
"uniform vec2 r; uniform float t;",
|
|
1992
|
+
"float hash(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}",
|
|
1993
|
+
"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;}",
|
|
1994
|
+
"void main(){",
|
|
1995
|
+
" vec2 uv=(gl_FragCoord.xy-.5*r)/min(r.x,r.y);",
|
|
1996
|
+
" vec2 p=uv*1.15; float tt=t*.08;",
|
|
1997
|
+
" float n=noise(p*2.2+vec2(tt*.6,-tt*.4)); n+=.5*noise(p*4.6-vec2(tt,tt*.7)); n*=.55;",
|
|
1998
|
+
" vec2 g=abs(fract(p*6.5)-.5); float grid=smoothstep(.06,0.,min(g.x,g.y));",
|
|
1999
|
+
" float d=length(p); float rings=0.;",
|
|
2000
|
+
" 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);}",
|
|
2001
|
+
" float nodes=0.;",
|
|
2002
|
+
" 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.);}",
|
|
2003
|
+
" vec3 bg=vec3(0.043,0.063,0.094);",
|
|
2004
|
+
" vec3 blue=vec3(0.486,0.769,1.0);",
|
|
2005
|
+
" vec3 cool=vec3(0.655,0.847,1.0);",
|
|
2006
|
+
" vec3 col=bg;",
|
|
2007
|
+
" col+=blue*(n*.2); col+=blue*grid*.05;",
|
|
2008
|
+
" col+=mix(blue,cool,.35)*rings*.22; col+=blue*nodes*.5;",
|
|
2009
|
+
" col+=blue*exp(-d*d*1.8)*.08;",
|
|
2010
|
+
" float vig=pow(max(1.-dot(uv*.72,uv*.72),0.),1.55);",
|
|
2011
|
+
" col*=vig; gl_FragColor=vec4(col,1.);",
|
|
2012
|
+
"}"
|
|
2013
|
+
].join("\n");
|
|
2014
|
+
|
|
2015
|
+
function compile(type, src){var s=gl.createShader(type);gl.shaderSource(s,src);gl.compileShader(s);return s;}
|
|
2016
|
+
var prog=gl.createProgram();
|
|
2017
|
+
gl.attachShader(prog,compile(gl.VERTEX_SHADER,vs));
|
|
2018
|
+
gl.attachShader(prog,compile(gl.FRAGMENT_SHADER,fs));
|
|
2019
|
+
gl.linkProgram(prog);gl.useProgram(prog);
|
|
2020
|
+
var buf=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buf);
|
|
2021
|
+
gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),gl.STATIC_DRAW);
|
|
2022
|
+
var loc=gl.getAttribLocation(prog,"p");gl.enableVertexAttribArray(loc);gl.vertexAttribPointer(loc,2,gl.FLOAT,false,0,0);
|
|
2023
|
+
var uR=gl.getUniformLocation(prog,"r"), uT=gl.getUniformLocation(prog,"t");
|
|
2024
|
+
var running=true;
|
|
2025
|
+
function resize(){
|
|
2026
|
+
var dpr=Math.min(window.devicePixelRatio||1,1.5);
|
|
2027
|
+
var w=Math.floor(canvas.clientWidth*dpr), h=Math.floor(canvas.clientHeight*dpr);
|
|
2028
|
+
if(canvas.width!==w||canvas.height!==h){canvas.width=w;canvas.height=h;gl.viewport(0,0,w,h);}
|
|
2029
|
+
}
|
|
2030
|
+
function frame(now){
|
|
2031
|
+
if(!running) return;
|
|
2032
|
+
resize();
|
|
2033
|
+
gl.uniform2f(uR,canvas.width,canvas.height);
|
|
2034
|
+
gl.uniform1f(uT,now*0.001);
|
|
2035
|
+
gl.drawArrays(gl.TRIANGLES,0,3);
|
|
2036
|
+
requestAnimationFrame(frame);
|
|
2037
|
+
}
|
|
2038
|
+
function fit(){canvas.style.width="100%";canvas.style.height="100%";resize();}
|
|
2039
|
+
fit();
|
|
2040
|
+
window.addEventListener("resize",fit,{passive:true});
|
|
2041
|
+
document.addEventListener("visibilitychange",function(){running=document.visibilityState==="visible";if(running)requestAnimationFrame(frame);});
|
|
2042
|
+
requestAnimationFrame(frame);
|
|
2043
|
+
})();
|
|
2044
|
+
</script>
|
|
2045
|
+
<script>
|
|
2046
|
+
(function(){
|
|
2047
|
+
var orb=document.getElementById("orb-video");
|
|
2048
|
+
if(orb){
|
|
2049
|
+
var showOrb=function(){orb.classList.add("ready");};
|
|
2050
|
+
if(orb.readyState>=2)showOrb();else orb.addEventListener("loadeddata",showOrb,{once:true});
|
|
2051
|
+
orb.addEventListener("error",function(){orb.style.display="none";},{once:true});
|
|
2052
|
+
var pl=orb.play&&orb.play();if(pl&&pl.catch)pl.catch(function(){});
|
|
2053
|
+
}
|
|
2054
|
+
var vids=[document.getElementById("cli-session"),document.getElementById("route-session"),document.getElementById("risk-session")].filter(Boolean);
|
|
2055
|
+
if(!vids.length)return;
|
|
2056
|
+
var reduce=window.matchMedia&&window.matchMedia("(prefers-reduced-motion:reduce)").matches;
|
|
2057
|
+
if(reduce)return;
|
|
2058
|
+
vids.forEach(function(v){
|
|
2059
|
+
function start(){var pr=v.play();if(pr&&pr.catch)pr.catch(function(){});}
|
|
2060
|
+
v.addEventListener("loadeddata",function(){v.classList.add("ready");},{once:true});
|
|
2061
|
+
if(!("IntersectionObserver" in window)){v.preload="auto";start();return;}
|
|
2062
|
+
var io=new IntersectionObserver(function(es){
|
|
2063
|
+
es.forEach(function(e){
|
|
2064
|
+
if(e.isIntersecting){v.preload="auto";start();}
|
|
2065
|
+
else{v.pause();}
|
|
2066
|
+
});
|
|
2067
|
+
},{threshold:.15});
|
|
2068
|
+
io.observe(v);
|
|
2069
|
+
});
|
|
2070
|
+
})();
|
|
2071
|
+
</script>
|
|
2072
|
+
</body>
|
|
2073
|
+
</html>
|