@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,29 @@
|
|
|
1
|
+
// Smoke-test the bundled dist against the real package surface.
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
|
|
4
|
+
const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url)));
|
|
5
|
+
const rows = [];
|
|
6
|
+
|
|
7
|
+
for (const [name, target] of Object.entries(pkg.exports || {})) {
|
|
8
|
+
if (typeof target !== "string" || !target.startsWith("./src/")) continue;
|
|
9
|
+
const distPath = "../dist/" + target.replace(/^\.\/src\//, "");
|
|
10
|
+
try {
|
|
11
|
+
const srcMod = await import(new URL(target.replace("./", "../"), import.meta.url).href);
|
|
12
|
+
const dstMod = await import(new URL(distPath, import.meta.url).href);
|
|
13
|
+
const s = Object.keys(srcMod).sort();
|
|
14
|
+
const d = Object.keys(dstMod).sort();
|
|
15
|
+
const missing = s.filter((k) => !d.includes(k));
|
|
16
|
+
rows.push({ name, src: s.length, dist: d.length, missing });
|
|
17
|
+
} catch (e) {
|
|
18
|
+
rows.push({ name, error: String(e.message).slice(0, 80) });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let bad = 0;
|
|
23
|
+
for (const r of rows) {
|
|
24
|
+
if (r.error) { bad++; console.log(` FAIL ${r.name.padEnd(20)} ${r.error}`); continue; }
|
|
25
|
+
if (r.missing.length) { bad++; console.log(` FAIL ${r.name.padEnd(20)} missing: ${r.missing.join(",")}`); continue; }
|
|
26
|
+
console.log(` OK ${r.name.padEnd(20)} ${r.dist} exports match`);
|
|
27
|
+
}
|
|
28
|
+
console.log(`\n${rows.length} entry points, ${bad} broken`);
|
|
29
|
+
process.exitCode = bad ? 1 : 0;
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Functionally verify Uniswap V3 venue addresses on every chain.
|
|
3
|
+
//
|
|
4
|
+
// Codesize alone is NOT verification -- an unrelated contract also has bytecode, and
|
|
5
|
+
// on Base the canonical mainnet addresses returned 2109 bytes for two different
|
|
6
|
+
// contracts, which is exactly the kind of false positive a size check waves through.
|
|
7
|
+
//
|
|
8
|
+
// The real test is behavioural: ask the candidate quoter to price a pair we already
|
|
9
|
+
// know the answer to. A contract that returns a sane WETH->USDC quote at a standard
|
|
10
|
+
// fee tier IS a working V3 quoter, regardless of what any doc claims.
|
|
11
|
+
//
|
|
12
|
+
// Output is a provenance record per chain, ready to paste into chains.config.mjs.
|
|
13
|
+
|
|
14
|
+
import { rpcCall } from "../src/data/providers/evm-rpc.mjs";
|
|
15
|
+
|
|
16
|
+
// Candidates. Most chains share the canonical deployment; Base, BSC and Avalanche
|
|
17
|
+
// have their own. All of these are CANDIDATES until the probe passes.
|
|
18
|
+
const CANONICAL_QUOTER = "0x61fFE014bA17989E743c5F6cB21bF9697530B21e";
|
|
19
|
+
const CANONICAL_ROUTER = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45";
|
|
20
|
+
|
|
21
|
+
const CANDIDATES = {
|
|
22
|
+
1: {
|
|
23
|
+
name: "ethereum",
|
|
24
|
+
quoter: CANONICAL_QUOTER,
|
|
25
|
+
router: CANONICAL_ROUTER,
|
|
26
|
+
tokenIn: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", // WETH
|
|
27
|
+
tokenOut: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
|
|
28
|
+
decIn: 18,
|
|
29
|
+
decOut: 6,
|
|
30
|
+
},
|
|
31
|
+
10: {
|
|
32
|
+
name: "optimism",
|
|
33
|
+
quoter: CANONICAL_QUOTER,
|
|
34
|
+
router: CANONICAL_ROUTER,
|
|
35
|
+
tokenIn: "0x4200000000000000000000000000000000000006",
|
|
36
|
+
tokenOut: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
|
|
37
|
+
decIn: 18,
|
|
38
|
+
decOut: 6,
|
|
39
|
+
},
|
|
40
|
+
56: {
|
|
41
|
+
name: "bsc",
|
|
42
|
+
quoter: "0x78D78E420Da98ad378D7799bE8f4AF69033EB077",
|
|
43
|
+
router: "0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",
|
|
44
|
+
tokenIn: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", // WBNB
|
|
45
|
+
tokenOut: "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", // USDC (18dp on BSC)
|
|
46
|
+
decIn: 18,
|
|
47
|
+
decOut: 18,
|
|
48
|
+
},
|
|
49
|
+
137: {
|
|
50
|
+
name: "polygon",
|
|
51
|
+
quoter: CANONICAL_QUOTER,
|
|
52
|
+
router: CANONICAL_ROUTER,
|
|
53
|
+
tokenIn: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", // WMATIC
|
|
54
|
+
tokenOut: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", // USDC native
|
|
55
|
+
decIn: 18,
|
|
56
|
+
decOut: 6,
|
|
57
|
+
},
|
|
58
|
+
8453: {
|
|
59
|
+
name: "base",
|
|
60
|
+
quoter: "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",
|
|
61
|
+
router: "0x2626664c2603336E57B271c5C0b26F421741e481",
|
|
62
|
+
tokenIn: "0x4200000000000000000000000000000000000006",
|
|
63
|
+
tokenOut: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
64
|
+
decIn: 18,
|
|
65
|
+
decOut: 6,
|
|
66
|
+
},
|
|
67
|
+
42161: {
|
|
68
|
+
name: "arbitrum",
|
|
69
|
+
quoter: CANONICAL_QUOTER,
|
|
70
|
+
router: CANONICAL_ROUTER,
|
|
71
|
+
tokenIn: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
|
|
72
|
+
tokenOut: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
|
|
73
|
+
decIn: 18,
|
|
74
|
+
decOut: 6,
|
|
75
|
+
},
|
|
76
|
+
// HyperEVM 999 is a FORK deployment (HyperSwap), not the canonical Uniswap
|
|
77
|
+
// addresses -- which is exactly why it sat fail-closed: it was never in this
|
|
78
|
+
// map, so it was never tested, and "untested" printed the same as "broken".
|
|
79
|
+
999: {
|
|
80
|
+
name: "hyperevm",
|
|
81
|
+
quoter: "0x03A918028f22D9E1473B7959C927AD7425A45C7C",
|
|
82
|
+
router: "0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",
|
|
83
|
+
tokenIn: "0x5555555555555555555555555555555555555555", // WHYPE
|
|
84
|
+
tokenOut: "0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb", // USDT0
|
|
85
|
+
decIn: 18,
|
|
86
|
+
decOut: 6,
|
|
87
|
+
},
|
|
88
|
+
// Stable 988 is a CANONICAL deployment (Official Uniswap v3 Deployments List,
|
|
89
|
+
// 2026-05-12) but was never in this map either. Pair is thin, so amountIn is
|
|
90
|
+
// sized up: 1 TOAST rounds to zero out, 10000 does not.
|
|
91
|
+
988: {
|
|
92
|
+
name: "stable",
|
|
93
|
+
quoter: "0xb070179E7032CdA868b53e6C1742F80c9e940d1A",
|
|
94
|
+
router: "0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",
|
|
95
|
+
tokenIn: "0x817997Ca8394E26CCE3dE3A076a4889b27DbF9dE", // WgUSDT
|
|
96
|
+
tokenOut: "0xd9c2E67afbc787ba9C7a886dd09947c127D3cC0d", // LEVCAT
|
|
97
|
+
decIn: 18,
|
|
98
|
+
decOut: 18,
|
|
99
|
+
feeTiers: [100],
|
|
100
|
+
// Deepest live pool on this chain (liquidity 1.41e24). An earlier candidate
|
|
101
|
+
// (TOAST/USDT0) drained from 1.4e19 to 0 mid-verification, so pick on depth.
|
|
102
|
+
},
|
|
103
|
+
// Abstract 2741 is a ZK-stack chain: canonical Uniswap addresses do not exist
|
|
104
|
+
// here (codesize 0), which is why probing them made it look like Abstract had
|
|
105
|
+
// no V3 at all. These are the real deployment, found from live swap traffic.
|
|
106
|
+
2741: {
|
|
107
|
+
name: "abstract",
|
|
108
|
+
quoter: "0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",
|
|
109
|
+
router: "0x7712FA47387542819d4E35A23f8116C90C18767C",
|
|
110
|
+
tokenIn: "0x3439153EB7AF838Ad19d56E1571FBD09333C2809", // WETH
|
|
111
|
+
tokenOut: "0x84A71ccD554Cc1b02749b35d22F684CC8ec987e1", // USDC.e
|
|
112
|
+
decIn: 18,
|
|
113
|
+
decOut: 6,
|
|
114
|
+
feeTiers: [500],
|
|
115
|
+
},
|
|
116
|
+
43114: {
|
|
117
|
+
name: "avalanche",
|
|
118
|
+
quoter: "0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",
|
|
119
|
+
router: "0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",
|
|
120
|
+
tokenIn: "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7", // WAVAX
|
|
121
|
+
tokenOut: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", // USDC
|
|
122
|
+
decIn: 18,
|
|
123
|
+
decOut: 6,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const FEE_TIERS = [500, 3000, 10000];
|
|
128
|
+
|
|
129
|
+
const word = (v) => BigInt(v).toString(16).padStart(64, "0");
|
|
130
|
+
const addrWord = (a) => a.slice(2).toLowerCase().padStart(64, "0");
|
|
131
|
+
|
|
132
|
+
// QuoterV2.quoteExactInputSingle((address,address,uint256,uint24,uint160))
|
|
133
|
+
// selector 0xc6a5026a -- struct is encoded inline as 5 words.
|
|
134
|
+
function encodeQuote({ tokenIn, tokenOut, amountIn, fee }) {
|
|
135
|
+
return (
|
|
136
|
+
"0xc6a5026a" +
|
|
137
|
+
addrWord(tokenIn) +
|
|
138
|
+
addrWord(tokenOut) +
|
|
139
|
+
word(amountIn) +
|
|
140
|
+
word(fee) +
|
|
141
|
+
word(0) // sqrtPriceLimitX96 = 0 (no limit)
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function codesize(chainId, address) {
|
|
146
|
+
const r = await rpcCall(chainId, "eth_getCode", [address, "latest"]).catch(() => null);
|
|
147
|
+
const raw = r?.result ?? r;
|
|
148
|
+
return raw && raw !== "0x" ? (raw.length - 2) / 2 : 0;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function probe(chainId, cfg) {
|
|
152
|
+
const result = {
|
|
153
|
+
chainId: Number(chainId),
|
|
154
|
+
name: cfg.name,
|
|
155
|
+
quoter: cfg.quoter,
|
|
156
|
+
router: cfg.router,
|
|
157
|
+
quoterCodesize: 0,
|
|
158
|
+
routerCodesize: 0,
|
|
159
|
+
workingFeeTier: null,
|
|
160
|
+
quotedOut: null,
|
|
161
|
+
humanPrice: null,
|
|
162
|
+
verdict: "FAIL",
|
|
163
|
+
reason: "",
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
result.quoterCodesize = await codesize(chainId, cfg.quoter);
|
|
167
|
+
result.routerCodesize = await codesize(chainId, cfg.router);
|
|
168
|
+
|
|
169
|
+
if (!result.quoterCodesize || !result.routerCodesize) {
|
|
170
|
+
result.reason = "no bytecode at candidate address on this chain";
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Behavioural probe: does it actually price a pair we can sanity-check?
|
|
175
|
+
const units = cfg.amountIn ?? 1n;
|
|
176
|
+
const amountIn = units * 10n ** BigInt(cfg.decIn);
|
|
177
|
+
for (const fee of cfg.feeTiers ?? FEE_TIERS) {
|
|
178
|
+
const data = encodeQuote({
|
|
179
|
+
tokenIn: cfg.tokenIn,
|
|
180
|
+
tokenOut: cfg.tokenOut,
|
|
181
|
+
amountIn,
|
|
182
|
+
fee,
|
|
183
|
+
});
|
|
184
|
+
const r = await rpcCall(chainId, "eth_call", [{ to: cfg.quoter, data }, "latest"]).catch(
|
|
185
|
+
() => null,
|
|
186
|
+
);
|
|
187
|
+
const raw = r?.result ?? r;
|
|
188
|
+
if (!raw || raw === "0x" || raw.length < 66) continue;
|
|
189
|
+
|
|
190
|
+
const out = BigInt(`0x${raw.slice(2, 66)}`);
|
|
191
|
+
if (out === 0n) continue;
|
|
192
|
+
|
|
193
|
+
result.workingFeeTier = fee;
|
|
194
|
+
result.quotedOut = out.toString();
|
|
195
|
+
result.humanPrice = Number(out) / 10 ** cfg.decOut;
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (result.workingFeeTier == null) {
|
|
200
|
+
result.reason = "bytecode present but no fee tier returned a quote -- not a working V3 quoter";
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Sanity band. A working quoter on a major pair should land in a plausible range;
|
|
205
|
+
// a wildly wrong number means we are talking to the wrong contract or decoding it
|
|
206
|
+
// wrong, and either way it must not be allowlisted.
|
|
207
|
+
if (result.humanPrice <= 0 || !Number.isFinite(result.humanPrice)) {
|
|
208
|
+
result.reason = `implausible quote ${result.humanPrice}`;
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
result.verdict = "PASS";
|
|
213
|
+
result.reason =
|
|
214
|
+
`quoteExactInputSingle at fee ${result.workingFeeTier} returned ` +
|
|
215
|
+
`${result.humanPrice} for 1 unit in -- a live, working V3 quote`;
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const out = [];
|
|
220
|
+
for (const [chainId, cfg] of Object.entries(CANDIDATES)) {
|
|
221
|
+
const r = await probe(chainId, cfg);
|
|
222
|
+
out.push(r);
|
|
223
|
+
const line =
|
|
224
|
+
`${r.name.padEnd(10)} ${r.verdict.padEnd(5)} ` +
|
|
225
|
+
`quoter=${String(r.quoterCodesize).padStart(6)} router=${String(r.routerCodesize).padStart(6)} ` +
|
|
226
|
+
(r.workingFeeTier ? `fee=${String(r.workingFeeTier).padStart(5)} price=${r.humanPrice}` : r.reason);
|
|
227
|
+
console.log(line);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
console.log(`\n${out.filter((r) => r.verdict === "PASS").length}/${out.length} chains verified`);
|
|
231
|
+
if (process.argv.includes("--json")) {
|
|
232
|
+
console.log(JSON.stringify(out, null, 2));
|
|
233
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: balance
|
|
3
|
+
description: Use when the user says balance, holdings, portfolio, wallet balance, or invokes /balance. Call the deterministic read-only multichain portfolio tool and report coverage honestly.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Balance
|
|
7
|
+
|
|
8
|
+
Use `portfolio_snapshot` for every fresh balance request. It runs the deterministic
|
|
9
|
+
multichain balance and NFT inventory reads once, then records one compact local
|
|
10
|
+
observation so the user can build history without a separate tracker.
|
|
11
|
+
|
|
12
|
+
Use `portfolio_history` for balance-history requests and `portfolio_value_graph`
|
|
13
|
+
for charts. Use `portfolio_balance` only when the user explicitly asks for a
|
|
14
|
+
non-recorded read or when local history storage is unavailable.
|
|
15
|
+
|
|
16
|
+
This skill is read-only. Public addresses are identifiers, not signing rights.
|
|
17
|
+
Never request a private key, seed phrase, wallet export, session key, or signature.
|
|
18
|
+
|
|
19
|
+
## Trigger
|
|
20
|
+
|
|
21
|
+
Run this workflow when the user:
|
|
22
|
+
|
|
23
|
+
- invokes `/balance`;
|
|
24
|
+
- says `balance` by itself;
|
|
25
|
+
- asks for holdings, wallet balance, portfolio, net assets, or assets across chains;
|
|
26
|
+
- supplies one or more public wallet addresses and asks what they hold.
|
|
27
|
+
|
|
28
|
+
## Address routing
|
|
29
|
+
|
|
30
|
+
Parse only public addresses supplied with the request:
|
|
31
|
+
|
|
32
|
+
- `0x...` maps to `addresses.evm` and `addresses.hyperliquid` unless the user
|
|
33
|
+
explicitly assigns different addresses;
|
|
34
|
+
- a Solana base58 public key maps to `addresses.solana`;
|
|
35
|
+
- a Bitcoin `bc1`, `1`, or `3` address maps to `addresses.bitcoin`;
|
|
36
|
+
- explicit labels such as `evm:`, `solana:`, `bitcoin:`, and `hyperliquid:` win.
|
|
37
|
+
|
|
38
|
+
If no addresses are in the request, call `portfolio_snapshot` with an empty object.
|
|
39
|
+
The tool uses configured public-address defaults:
|
|
40
|
+
|
|
41
|
+
- `ORACLE_EVM_ADDRESS`, with legacy fallback `ORACLE_DEFAULT_ADDRESS`;
|
|
42
|
+
- `ORACLE_SOLANA_ADDRESS`;
|
|
43
|
+
- `ORACLE_BITCOIN_ADDRESS`;
|
|
44
|
+
- `ORACLE_HYPERLIQUID_ADDRESS`, with EVM fallback.
|
|
45
|
+
|
|
46
|
+
If every family returns `not-configured`, ask only for the missing public addresses.
|
|
47
|
+
Do not call a zero address a user wallet and do not report missing families as zero.
|
|
48
|
+
|
|
49
|
+
## Mandatory call
|
|
50
|
+
|
|
51
|
+
Call `portfolio_snapshot`:
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"addresses": {
|
|
56
|
+
"evm": "optional public address",
|
|
57
|
+
"solana": "optional public key",
|
|
58
|
+
"bitcoin": "optional public address",
|
|
59
|
+
"hyperliquid": "optional public address"
|
|
60
|
+
},
|
|
61
|
+
"includeTokens": true,
|
|
62
|
+
"includeCollectibles": true,
|
|
63
|
+
"includePrices": true,
|
|
64
|
+
"includeNfts": true
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Omit address fields the user did not supply. Omit `evmChainIds` unless the user
|
|
69
|
+
asks for a subset. The default queries every configured EVM chain. Read fungible
|
|
70
|
+
and chain details from `result.balance`, NFT holdings from `result.nfts`, and the
|
|
71
|
+
combined historical observation from `result.snapshot`.
|
|
72
|
+
|
|
73
|
+
Never call a chain write, prepare, sign, send, submit, execute, or broadcast tool
|
|
74
|
+
while answering a balance request. The compact profile-local history append made
|
|
75
|
+
by `portfolio_snapshot` is allowed and contains no keys or executable payloads.
|
|
76
|
+
|
|
77
|
+
## Coverage contract
|
|
78
|
+
|
|
79
|
+
The current aggregator covers:
|
|
80
|
+
|
|
81
|
+
- native balances on every configured EVM chain;
|
|
82
|
+
- Solana SOL plus SPL Token and Token-2022 accounts;
|
|
83
|
+
- Bitcoin BTC plus Runes and inscriptions when an address indexer is configured;
|
|
84
|
+
- Hyperliquid HyperCore spot balances and perp account state;
|
|
85
|
+
- OpenSea-supported EVM/Solana NFT inventory and Bitcoin inscriptions where the
|
|
86
|
+
configured providers expose owner data;
|
|
87
|
+
- profile-local snapshots and an SVG known-value history graph.
|
|
88
|
+
|
|
89
|
+
It must explicitly report unsupported or unavailable surfaces:
|
|
90
|
+
|
|
91
|
+
- EVM token and NFT enumeration is unavailable without an address indexer;
|
|
92
|
+
- Solana token accounts are unverified until metadata confirms symbol and spam
|
|
93
|
+
status;
|
|
94
|
+
- a Solana amount of one with zero decimals is only a collectible candidate;
|
|
95
|
+
- Bitcoin Runes and inscriptions require an address-indexed provider;
|
|
96
|
+
- Cosmos requires a chain-specific bech32 address and LCD/RPC adapter;
|
|
97
|
+
- Sui and Aptos remain unsupported until their balance adapters are installed;
|
|
98
|
+
- any provider failure is `unavailable`, never a zero balance;
|
|
99
|
+
- NFT prices are provider estimates, not executable bids.
|
|
100
|
+
|
|
101
|
+
## History and graph
|
|
102
|
+
|
|
103
|
+
For “balance history”, “portfolio history”, or a date range, call
|
|
104
|
+
`portfolio_history` with the same public addresses and the requested `since`,
|
|
105
|
+
`until`, and `limit`. Keep `null` values unavailable. Do not interpolate them.
|
|
106
|
+
|
|
107
|
+
For “graph”, “chart”, or “show me performance”, call `portfolio_value_graph`.
|
|
108
|
+
State the returned `summary.changeUsd`, `summary.changePct`, point count, and
|
|
109
|
+
whether any plotted snapshots were incomplete. The image plots known priced
|
|
110
|
+
value, not guaranteed liquidation value or net worth.
|
|
111
|
+
|
|
112
|
+
## Response format
|
|
113
|
+
|
|
114
|
+
Start with:
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
Balance, <queriedAt>
|
|
118
|
+
Known priced value: $<knownUsd> (not a complete total)
|
|
119
|
+
Coverage: <ok>/<requestedSurfaces> surfaces live
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
If `valuation.complete` is true, you may remove the parenthetical. Do not rename
|
|
123
|
+
`knownUsd` to `total`, `net worth`, or `portfolio value` when coverage is partial.
|
|
124
|
+
|
|
125
|
+
Then show nonzero assets first, grouped by family:
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
EVM
|
|
129
|
+
Ethereum: 0.42 ETH $...
|
|
130
|
+
Base: 18.1 ETH $...
|
|
131
|
+
|
|
132
|
+
Solana
|
|
133
|
+
SOL: ...
|
|
134
|
+
SPL: <mint> <amount> unverified
|
|
135
|
+
|
|
136
|
+
Bitcoin
|
|
137
|
+
BTC: ...
|
|
138
|
+
Runes: ...
|
|
139
|
+
Inscriptions: ...
|
|
140
|
+
|
|
141
|
+
Hyperliquid
|
|
142
|
+
Spot: ...
|
|
143
|
+
Perps account value: $...
|
|
144
|
+
Positions: ...
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Collapse successful zero-native EVM chains into one line:
|
|
148
|
+
|
|
149
|
+
```text
|
|
150
|
+
Zero native: Polygon, Optimism, Arbitrum
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
End with concise exceptions:
|
|
154
|
+
|
|
155
|
+
```text
|
|
156
|
+
Unavailable: <failed providers or unconfigured addresses>
|
|
157
|
+
Unpriced: <nonzero assets without a price>
|
|
158
|
+
Warnings: <spam, stale, unknown-not-empty, or incomplete discovery warnings>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Do not dump raw RPC payloads unless the user asks. Keep exact public addresses in
|
|
162
|
+
the response only when the user supplied multiple addresses and disambiguation is
|
|
163
|
+
necessary.
|
|
164
|
+
|
|
165
|
+
## Truth rules
|
|
166
|
+
|
|
167
|
+
- `0` means a provider successfully returned zero.
|
|
168
|
+
- `unavailable` means the provider failed or the adapter is absent.
|
|
169
|
+
- `not-configured` means the public address is missing.
|
|
170
|
+
- `unknownNotEmpty` means the provider cannot tell whether assets exist. Never
|
|
171
|
+
convert it to an empty portfolio.
|
|
172
|
+
- Every USD figure must carry a price source and query timestamp in the tool
|
|
173
|
+
result.
|
|
174
|
+
- Do not sum Stable Mainnet native USDT0 with its mirrored ERC-20 representation.
|
|
175
|
+
- Do not price unverified or spam tokens by symbol alone.
|
|
176
|
+
- Do not hide failed chains to make the summary look complete.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bitcoin-l1
|
|
3
|
+
description: Use for Bitcoin L1, Ordinals, and Runes operations.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Bitcoin L1
|
|
7
|
+
|
|
8
|
+
## Read
|
|
9
|
+
- `data btc_balance <addr>` — balance in sats
|
|
10
|
+
- `data btc_utxos <addr>` — UTXO set
|
|
11
|
+
- `data btc_fees` — current fee rates (sats/vB)
|
|
12
|
+
- `data btc_tx <txid>` — transaction lookup
|
|
13
|
+
|
|
14
|
+
## Ordinals
|
|
15
|
+
- `data btc_inscriptions <addr>` — inscriptions held
|
|
16
|
+
- `data btc_inscription_info <id>` — inscription metadata
|
|
17
|
+
- `data satflow_floors <collection>` — floor prices
|
|
18
|
+
- `data satflow_floor_listings <collection>` — active listings
|
|
19
|
+
|
|
20
|
+
## Runes
|
|
21
|
+
- `data btc_rune_balance <addr>` — rune balances
|
|
22
|
+
- `exec bitcoin_runes_prepare_transfer` — prepare transfer
|
|
23
|
+
|
|
24
|
+
## Prepare
|
|
25
|
+
- `exec bitcoin_prepare <from> <to> <amountSats>` — payment intent
|
|
26
|
+
- `exec bitcoin_inscribe_prepare` — inscription commit/reveal
|
|
27
|
+
- `exec bitcoin_satflow_prepare_purchase` — buy ordinals/rune
|
|
28
|
+
|
|
29
|
+
## Key rules
|
|
30
|
+
- 1 BTC = 100,000,000 sats
|
|
31
|
+
- Never consume inscribed/rare-sat UTXOs as fee inputs
|
|
32
|
+
- PSBT review before sign — user must approve
|
|
33
|
+
- Payment and ordinals addresses should be distinct when wallet separates them
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: chain-defi-ecosystem-profiling
|
|
3
|
+
description: Use when profiling a chain's DeFi ecosystem — TVL, protocols, gaps.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Chain ecosystem profiling
|
|
7
|
+
|
|
8
|
+
## Data sources
|
|
9
|
+
- `data llama_protocols` — DeFiLlama protocol list with TVL
|
|
10
|
+
- `data llama_prices` — current prices keyed by chain:address
|
|
11
|
+
- `data dex_search` — token discovery
|
|
12
|
+
- `data data_health` — which data providers are live
|
|
13
|
+
- `data scanner_coverage` — which chains scanner supports
|
|
14
|
+
|
|
15
|
+
## What to report
|
|
16
|
+
1. **TVL** — total value locked, top 5 protocols by TVL
|
|
17
|
+
2. **DEX volume** — 24h volume, active pairs
|
|
18
|
+
3. **Lending** — money markets, rates
|
|
19
|
+
4. **Bridges** — canonical bridge, third-party options
|
|
20
|
+
5. **Gaps** — missing primitives (no lending, no stablecoin, etc.)
|
|
21
|
+
6. **Risk** — bridge risk, oracle risk, concentration risk
|
|
22
|
+
|
|
23
|
+
## Confidence
|
|
24
|
+
- Live DeFiLlama data = high confidence
|
|
25
|
+
- Recent but not real-time = moderate
|
|
26
|
+
- Community estimates = low
|
|
27
|
+
- Unknown = say unknown
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: evm-contract-research
|
|
3
|
+
description: Use when researching or verifying EVM contracts, routers, factories, or tokens.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# EVM contract research
|
|
7
|
+
|
|
8
|
+
## Verification
|
|
9
|
+
1. `data dex_search <symbol>` → find token home chain + address
|
|
10
|
+
2. `data dex_token <address>` → live pairs, volume, liquidity, age
|
|
11
|
+
3. `data rpc_balance <address>` → native balance on chain
|
|
12
|
+
4. `exec evm_erc20_allowance <owner> <spender>` → check approvals
|
|
13
|
+
5. Use block explorer for source code verification
|
|
14
|
+
|
|
15
|
+
## Red flags
|
|
16
|
+
- No verified contract on explorer
|
|
17
|
+
- Created < 24h ago
|
|
18
|
+
- Liquidity < $10k
|
|
19
|
+
- Single LP holding > 50%
|
|
20
|
+
- Buy/sell tax > 5%
|
|
21
|
+
- Honeypot (can buy, can't sell)
|
|
22
|
+
- Proxy with unverified implementation
|
|
23
|
+
|
|
24
|
+
## Trusted routers (verify on-chain, don't assume)
|
|
25
|
+
- Uniswap V2 Router: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D (Ethereum)
|
|
26
|
+
- Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564
|
|
27
|
+
- UniversalRouter: 0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hyperliquid
|
|
3
|
+
description: Use when working with Hyperliquid L1 — perps, spot, points, or HyperEVM.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Hyperliquid
|
|
7
|
+
|
|
8
|
+
## Read plane (keyless)
|
|
9
|
+
- `data data_call hl-info allMids` — all perp mid prices
|
|
10
|
+
- `data data_call hl-info l2Book` — L2 orderbook depth
|
|
11
|
+
- `data data_call hl-info userState` — user positions + margin
|
|
12
|
+
- `data data_call hl-info userFills` — trade history
|
|
13
|
+
- `data data_call hl-info candleSnapshot` — OHLCV candles
|
|
14
|
+
- `data data_call hl-info spotMeta` — spot market metadata
|
|
15
|
+
- `data data_call hl-ws allMids` — fast WS snapshot
|
|
16
|
+
|
|
17
|
+
## HyperEVM (chain 999)
|
|
18
|
+
- RPC: https://rpc.hyperliquid.xyz/evm
|
|
19
|
+
- Explorer: https://www.hyperscan.com
|
|
20
|
+
- DEX search via `data dex_token` on chain 999
|
|
21
|
+
- Gas: paid in HyperEVM native token, ~0.1-0.5 USD typical
|
|
22
|
+
|
|
23
|
+
## Points
|
|
24
|
+
- Earned through perp trading volume
|
|
25
|
+
- No public API for points balance — uses userState for volume inference
|
|
26
|
+
- Wallet age + volume are primary signals
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: multichain-exec-desk
|
|
3
|
+
description: Use for cross-chain or multi-chain execution tasks.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Multichain execution desk
|
|
7
|
+
|
|
8
|
+
## Chain routing
|
|
9
|
+
- RH 4663 → oracle owns it (rhbot executor)
|
|
10
|
+
- Hyperliquid → hl-info / hl-ws (read-only, keyless)
|
|
11
|
+
- EVM chains → mad_exec evm_* tools
|
|
12
|
+
- Solana → Jupiter tools
|
|
13
|
+
- Bitcoin → btc_* tools
|
|
14
|
+
|
|
15
|
+
## Execution flow
|
|
16
|
+
1. `data evm_chains` — list supported chains
|
|
17
|
+
2. `data dex_search` — resolve token
|
|
18
|
+
3. `exec evm_quote` — quote swap
|
|
19
|
+
4. `data best_swap_route` — compare aggregators
|
|
20
|
+
5. `exec evm_prepare` — build unsigned tx
|
|
21
|
+
6. `exec evm_simulate` — simulate (optional but recommended)
|
|
22
|
+
7. `exec evm_sign` — sign (gated)
|
|
23
|
+
8. `exec evm_send` — broadcast (gated)
|
|
24
|
+
|
|
25
|
+
## Cross-chain
|
|
26
|
+
- `data best_bridge_route` — compare bridge providers
|
|
27
|
+
- `data prepare_best_bridge_route` — build signable bridge tx
|
|
28
|
+
- `data rfq_quote` — RFQ/intent routing for large sizes
|
|
29
|
+
|
|
30
|
+
## Safety
|
|
31
|
+
- Verify destination chainId matches intent
|
|
32
|
+
- Check bridge provider is live (data health first)
|
|
33
|
+
- Never route through unverified contracts
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oracle-action-semantics
|
|
3
|
+
description: Use for watch, ping, prepare, arm, sign, send, or execution-capability questions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Oracle action semantics
|
|
7
|
+
|
|
8
|
+
Keep these planes distinct:
|
|
9
|
+
|
|
10
|
+
1. **Public prepare plane**: reads, quotes, simulates, and prepares unsigned artifacts. It never signs or broadcasts.
|
|
11
|
+
2. **Generic Oracle signer**: the unattended daemon exposes six *bounded* surfaces — `hl`, `poly`, `evm-swap`, `evm-bridge`, `btc`, `sol`. Bounded is not generic chain authority: each surface decodes and validates its own envelope shape and refuses while its allowlists are empty. Enablement is never authority; every signature still needs one exact owner-confirmed grant.
|
|
12
|
+
3. **User-wallet EVM**: ordinary EVM preparations require the user's wallet signature.
|
|
13
|
+
4. **Optional bounded EVM execution**: a deployment may expose a separate same-host, owner-gated EVM executor such as MAD. Verify its status and policy before saying it is available. Never infer it from the public package or the generic signer.
|
|
14
|
+
|
|
15
|
+
Do not turn a deployment fact into a universal claim. If no bounded EVM executor is installed or healthy, say the current deployment cannot execute EVM. Do not say Oracle can never execute EVM.
|
|
16
|
+
|
|
17
|
+
## Binding vocabulary
|
|
18
|
+
|
|
19
|
+
- `watch`, `watch this`, `ping`, `ping me`, `alert`, and `notify` mean notification only.
|
|
20
|
+
- Persist them as `active: true` and `actionMode: alert_only`.
|
|
21
|
+
- `arm` means authorization intent for one exact bounded action.
|
|
22
|
+
- Persist it as `active: true` and `actionMode: execute` only after the exact action and owner authorization are present.
|
|
23
|
+
- Never convert `watch` into execution.
|
|
24
|
+
- Never convert `arm` into a watch.
|
|
25
|
+
- A status field such as `armed` is not action authority. Current records require explicit `active` and `actionMode` fields.
|
|
26
|
+
|
|
27
|
+
Before accepting `arm`, require the exact chain, token pair, amount or fraction, trigger, recipient, router, deadline, slippage bound, and approval bound. Require the owner-gated executor to be healthy and disarmed until that exact action is authorized. Refuse global, implied, or reusable authorization.
|
|
28
|
+
|
|
29
|
+
## Execution states
|
|
30
|
+
|
|
31
|
+
Report each state separately:
|
|
32
|
+
|
|
33
|
+
- `executionReady`
|
|
34
|
+
- `requiresUserSignature`
|
|
35
|
+
- `signingReady`
|
|
36
|
+
- `broadcastReady`
|
|
37
|
+
|
|
38
|
+
A quote is not a preparation. A preparation is not a signature. A signature is not a broadcast. A broadcast is not mined execution. Claim success only after a transaction hash, successful receipt, and expected balance delta.
|
|
39
|
+
|
|
40
|
+
ERC-20 approval is a separate transaction. Use an exact bounded amount unless the user explicitly authorizes another cap. Never silently create an unlimited approval.
|