@oracle-agent/oracle 0.11.0 → 0.13.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/LICENSE +115 -201
- package/README.md +13 -516
- package/bin/oracle.mjs +19 -27
- package/package.json +15 -98
- package/CONTRIBUTING.md +0 -98
- package/SECURITY.md +0 -89
- package/SETUP.md +0 -381
- package/artifacts/inscription/oracle-was-here-preview.png +0 -0
- package/artifacts/inscription/oracle-was-here.svg +0 -1
- package/artifacts/specialist-packs/oracle-full-crypto.json +0 -295
- package/bin/desk-server.mjs +0 -440
- package/bin/oracle-data-mcp.mjs +0 -1019
- package/bin/oracle-init.mjs +0 -496
- package/bin/oracle-public-server.mjs +0 -36
- package/bin/oracle-route.mjs +0 -254
- package/bin/oracle-scan.mjs +0 -192
- package/bin/oracle-upgrade.mjs +0 -42
- package/docs/adding-a-chain.md +0 -229
- package/docs/architecture.md +0 -138
- package/docs/cli.md +0 -47
- package/docs/connectors.md +0 -13
- package/docs/oracle-pack-standard.md +0 -29
- package/docs/profiles.md +0 -151
- package/docs/public-surface.md +0 -133
- package/examples/add-a-chain.mjs +0 -65
- package/examples/oracle-pack-template.mjs +0 -38
- package/examples/research-a-token.mjs +0 -70
- package/plugins/oracle-owner-gate/__init__.py +0 -227
- package/plugins/oracle-owner-gate/plugin.yaml +0 -9
- package/profiles/_template/SOUL.md +0 -54
- package/profiles/_template/profile.json +0 -22
- package/profiles/bitcoin-agent/SOUL.md +0 -31
- package/profiles/bitcoin-agent/profile.json +0 -32
- package/profiles/hyperliquid-agent/SOUL.md +0 -34
- package/profiles/hyperliquid-agent/profile.json +0 -37
- package/profiles/oracle/SOUL.md +0 -107
- package/profiles/oracle/profile.json +0 -39
- package/profiles/polymarket-agent/SOUL.md +0 -35
- package/profiles/polymarket-agent/profile.json +0 -34
- package/profiles/profile.schema.json +0 -90
- package/profiles/protocol-builder/SOUL.md +0 -57
- package/profiles/protocol-builder/profile.json +0 -39
- package/profiles/robinhood-agent/SOUL.md +0 -53
- package/profiles/robinhood-agent/profile.json +0 -40
- package/profiles/solana-agent/SOUL.md +0 -37
- package/profiles/solana-agent/profile.json +0 -37
- package/profiles/stable-agent/SOUL.md +0 -43
- package/profiles/stable-agent/profile.json +0 -37
- package/protocols/templates/safe-erc20/SECURITY.md +0 -16
- package/protocols/templates/safe-erc20/foundry.toml +0 -12
- package/protocols/templates/safe-erc20/remappings.txt +0 -2
- package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
- package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
- package/public/agent-connect/app.js +0 -84
- package/public/agent-connect/index.html +0 -83
- package/public/agent-connect/styles.css +0 -70
- package/public/index.html +0 -12
- package/public/oracle-console/app.js +0 -272
- package/public/oracle-console/bitcoin-wallets.js +0 -206
- package/public/oracle-console/index.html +0 -91
- package/public/oracle-console/styles.css +0 -239
- package/public/oracle-splash/assets/cli-chain-hyperliquid.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/llms/claude.svg +0 -1
- package/public/oracle-splash/assets/llms/codex-icon.svg +0 -1
- package/public/oracle-splash/assets/llms/codex.svg +0 -1
- package/public/oracle-splash/assets/llms/cursor-icon.svg +0 -12
- package/public/oracle-splash/assets/llms/cursor.svg +0 -17
- package/public/oracle-splash/assets/llms/deepseek.svg +0 -1
- package/public/oracle-splash/assets/llms/gemini-icon.svg +0 -1
- package/public/oracle-splash/assets/llms/gemini.svg +0 -1
- package/public/oracle-splash/assets/llms/grok.svg +0 -8
- package/public/oracle-splash/assets/llms/hermes.png +0 -0
- package/public/oracle-splash/assets/llms/kimi-icon.svg +0 -1
- package/public/oracle-splash/assets/llms/kimi.svg +0 -1
- package/public/oracle-splash/assets/llms/manus.svg +0 -18
- package/public/oracle-splash/assets/llms/openclaw.svg +0 -22
- package/public/oracle-splash/assets/llms/perplexity.svg +0 -1
- package/public/oracle-splash/assets/llms/qwen.svg +0 -1
- package/public/oracle-splash/assets/llms/windsurf.svg +0 -1
- 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 +0 -4
- package/public/oracle-splash/assets/wordmarks/aerodrome.svg +0 -23
- package/public/oracle-splash/assets/wordmarks/balancer.svg +0 -3
- package/public/oracle-splash/assets/wordmarks/cowswap.svg +0 -1
- package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
- package/public/oracle-splash/assets/wordmarks/gmx.svg +0 -13
- package/public/oracle-splash/assets/wordmarks/hop-icon.webp +0 -0
- package/public/oracle-splash/assets/wordmarks/hyena.svg +0 -7
- package/public/oracle-splash/assets/wordmarks/hyperliquid.svg +0 -21
- package/public/oracle-splash/assets/wordmarks/hyperswap.svg +0 -13
- package/public/oracle-splash/assets/wordmarks/jupiter.svg +0 -35
- package/public/oracle-splash/assets/wordmarks/kinetiq.svg +0 -1
- 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 +0 -1
- package/public/oracle-splash/assets/wordmarks/markets.svg +0 -1
- package/public/oracle-splash/assets/wordmarks/morpho.svg +0 -1
- package/public/oracle-splash/assets/wordmarks/odos.svg +0 -3
- package/public/oracle-splash/assets/wordmarks/oneinch-icon.webp +0 -0
- package/public/oracle-splash/assets/wordmarks/oneinch.svg +0 -6
- package/public/oracle-splash/assets/wordmarks/opensea-icon.svg +0 -17
- package/public/oracle-splash/assets/wordmarks/opensea.svg +0 -1
- package/public/oracle-splash/assets/wordmarks/outcome.svg +0 -16
- package/public/oracle-splash/assets/wordmarks/pancakeswap.svg +0 -18
- package/public/oracle-splash/assets/wordmarks/paragon.svg +0 -9
- package/public/oracle-splash/assets/wordmarks/paraswap.svg +0 -16
- 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 +0 -8
- 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 +0 -15
- package/public/oracle-splash/assets/wordmarks/uniswap.svg +0 -18
- package/public/oracle-splash/assets/wordmarks/velodrome.svg +0 -84
- package/public/oracle-splash/assets/wordmarks/xyz.svg +0 -12
- 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/favicon.ico +0 -0
- package/public/oracle-splash/favicon.svg +0 -6
- package/public/oracle-splash/index.html +0 -1558
- package/public/oracle-splash/mesh-graph.png +0 -0
- package/public/oracle-splash/mesh-graph.svg +0 -216
- package/scripts/adversarial-bench.mjs +0 -114
- package/scripts/build-inscription.py +0 -230
- package/scripts/check-doc-drift.mjs +0 -123
- package/scripts/check-test-count.mjs +0 -105
- package/scripts/e2e-hl-markets.mjs +0 -21
- package/scripts/e2e-hl-perps.mjs +0 -48
- package/scripts/e2e-hypercore-staking.mjs +0 -128
- package/scripts/e2e-solana-bitcoin.mjs +0 -183
- package/scripts/protocol-template-gate.mjs +0 -15
- package/scripts/public-api-scan.mjs +0 -23
- package/scripts/secret-scan.mjs +0 -181
- package/scripts/verify-v3-venues.mjs +0 -192
- package/skills/balance/SKILL.md +0 -176
- package/skills/oracle-action-semantics/SKILL.md +0 -40
- package/skills/oracle-best-execution/SKILL.md +0 -127
- package/skills/oracle-bitcoin/SKILL.md +0 -53
- package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
- package/skills/oracle-chat/SKILL.md +0 -61
- package/skills/oracle-chat/chain.SKILL.md +0 -31
- package/skills/oracle-chat/setup.SKILL.md +0 -37
- package/skills/oracle-circuit-breaker/SKILL.md +0 -51
- package/skills/oracle-contract-research/SKILL.md +0 -55
- package/skills/oracle-desk/SKILL.md +0 -58
- package/skills/oracle-dex-launch/SKILL.md +0 -38
- package/skills/oracle-grants/SKILL.md +0 -69
- package/skills/oracle-hypercore-staking/SKILL.md +0 -57
- package/skills/oracle-hyperliquid/SKILL.md +0 -56
- package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
- package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
- package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
- package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
- package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
- package/skills/oracle-polymarket/SKILL.md +0 -60
- package/skills/oracle-protocol-builder/SKILL.md +0 -59
- package/skills/oracle-protocol-security/SKILL.md +0 -60
- package/skills/oracle-public-product/SKILL.md +0 -44
- package/skills/oracle-receipts/SKILL.md +0 -52
- package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
- package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
- package/skills/oracle-solana/SKILL.md +0 -65
- package/skills/oracle-solana-nft/SKILL.md +0 -54
- package/skills/oracle-token-research/SKILL.md +0 -67
- package/skins/oracle.yaml +0 -56
- package/src/action-receipts.mjs +0 -265
- package/src/action-semantics.mjs +0 -62
- package/src/address-book.mjs +0 -208
- package/src/agent-auth.mjs +0 -206
- package/src/approval-guard.mjs +0 -282
- package/src/attestation-secret.mjs +0 -88
- package/src/audit-log.mjs +0 -196
- package/src/auth/oauth.mjs +0 -672
- package/src/auto-slippage.mjs +0 -378
- package/src/capability-posture.mjs +0 -125
- package/src/chains.mjs +0 -62
- package/src/cli/chain-catalog.mjs +0 -215
- package/src/cli/chain-state.mjs +0 -74
- package/src/cli/commands/auth.mjs +0 -193
- package/src/cli/commands/bootstrap.mjs +0 -87
- package/src/cli/commands/chain.mjs +0 -143
- package/src/cli/commands/chat.mjs +0 -434
- package/src/cli/commands/credential.mjs +0 -9
- package/src/cli/commands/data-mcp.mjs +0 -18
- package/src/cli/commands/data.mjs +0 -75
- package/src/cli/commands/doctor.mjs +0 -136
- package/src/cli/commands/help.mjs +0 -7
- package/src/cli/commands/init.mjs +0 -27
- package/src/cli/commands/mcp.mjs +0 -142
- package/src/cli/commands/model.mjs +0 -99
- package/src/cli/commands/prepare.mjs +0 -12
- package/src/cli/commands/public.mjs +0 -20
- package/src/cli/commands/route.mjs +0 -12
- package/src/cli/commands/runner.mjs +0 -9
- package/src/cli/commands/scan.mjs +0 -12
- package/src/cli/commands/setup.mjs +0 -275
- package/src/cli/commands/sign.mjs +0 -21
- package/src/cli/commands/signer.mjs +0 -9
- package/src/cli/commands/upgrade.mjs +0 -12
- package/src/cli/commands/vault.mjs +0 -9
- package/src/cli/commands/version.mjs +0 -22
- package/src/cli/first-run.mjs +0 -23
- package/src/cli/kernel.mjs +0 -239
- package/src/cli/mcp-targets/chatgpt.mjs +0 -51
- package/src/cli/mcp-targets/claude-code.mjs +0 -39
- package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
- package/src/cli/mcp-targets/codex.mjs +0 -41
- package/src/cli/mcp-targets/shared.mjs +0 -61
- package/src/cli/messaging-platforms.mjs +0 -209
- package/src/cli/model-config.mjs +0 -70
- package/src/cli/operator-dispatch.mjs +0 -258
- package/src/cli/oracle-harness.py +0 -415
- package/src/cli/paths.mjs +0 -83
- package/src/cli/runtime.mjs +0 -351
- package/src/cli/setup-state.mjs +0 -168
- package/src/cli/spawn-child.mjs +0 -43
- package/src/data/catalog.mjs +0 -585
- package/src/data/desk-data.mjs +0 -695
- package/src/data/http.mjs +0 -253
- package/src/data/provider-endpoint.mjs +0 -94
- package/src/data/providers/aerodrome.mjs +0 -245
- package/src/data/providers/balancer.mjs +0 -209
- package/src/data/providers/bitcoin-esplora.mjs +0 -216
- package/src/data/providers/bitcoin-meta.mjs +0 -378
- package/src/data/providers/blockscout.mjs +0 -14
- package/src/data/providers/bridges.mjs +0 -242
- package/src/data/providers/cowswap.mjs +0 -415
- package/src/data/providers/curve.mjs +0 -201
- package/src/data/providers/defillama.mjs +0 -88
- package/src/data/providers/dexscreener.mjs +0 -43
- package/src/data/providers/evm-rpc.mjs +0 -225
- package/src/data/providers/geckoterminal.mjs +0 -34
- package/src/data/providers/gmx.mjs +0 -496
- package/src/data/providers/hl-assets.mjs +0 -165
- package/src/data/providers/hl-info.mjs +0 -108
- package/src/data/providers/hl-markets.mjs +0 -210
- package/src/data/providers/hl-outcome.mjs +0 -61
- package/src/data/providers/hl-perps.mjs +0 -387
- package/src/data/providers/hl-staking.mjs +0 -353
- package/src/data/providers/hl-ws.mjs +0 -119
- package/src/data/providers/hyperevm-dex.mjs +0 -49
- package/src/data/providers/jupiter-venues.mjs +0 -119
- package/src/data/providers/jupiter.mjs +0 -315
- package/src/data/providers/lifi.mjs +0 -151
- package/src/data/providers/magiceden-sol.mjs +0 -406
- package/src/data/providers/morpho.mjs +0 -177
- package/src/data/providers/nft-gallery.mjs +0 -163
- package/src/data/providers/nft-portfolio.mjs +0 -494
- package/src/data/providers/odos.mjs +0 -156
- package/src/data/providers/oneinch.mjs +0 -174
- package/src/data/providers/opensea-multichain.mjs +0 -136
- package/src/data/providers/opensea-nft.mjs +0 -371
- package/src/data/providers/paraswap.mjs +0 -118
- package/src/data/providers/pendle.mjs +0 -188
- package/src/data/providers/poly-clob.mjs +0 -283
- package/src/data/providers/poly-public.mjs +0 -96
- package/src/data/providers/poly-ws.mjs +0 -103
- package/src/data/providers/portfolio-history.mjs +0 -394
- package/src/data/providers/portfolio.mjs +0 -594
- package/src/data/providers/rfq.mjs +0 -15
- package/src/data/providers/rh-agent.mjs +0 -59
- package/src/data/providers/satflow.mjs +0 -341
- package/src/data/providers/signed-material-guard.mjs +0 -108
- package/src/data/providers/solana-rpc.mjs +0 -197
- package/src/data/providers/uniswap-v3.mjs +0 -349
- package/src/data/providers/uniswap-v4.mjs +0 -414
- package/src/data/providers/zerox.mjs +0 -167
- package/src/data/public-api-scan.mjs +0 -61
- package/src/data/quote-placeholder.mjs +0 -31
- package/src/exact-integer.mjs +0 -72
- package/src/exec-policy.mjs +0 -455
- package/src/flags.mjs +0 -15
- package/src/fresh-window.mjs +0 -76
- package/src/gmx-attestation.mjs +0 -176
- package/src/index.mjs +0 -100
- package/src/nft-gas-war-guard.mjs +0 -139
- package/src/onboarding/agent-keys.mjs +0 -161
- package/src/onboarding/harness-configs.mjs +0 -102
- package/src/onboarding/index.mjs +0 -18
- package/src/onboarding/tiers.mjs +0 -139
- package/src/oracle-env.mjs +0 -47
- package/src/portfolio-risk.mjs +0 -170
- package/src/prepare-envelope.mjs +0 -204
- package/src/profile-upgrade.mjs +0 -277
- package/src/protocol-execution.mjs +0 -84
- package/src/protocol-templates/gate.mjs +0 -179
- package/src/protocol-templates/prepare-deploy.mjs +0 -81
- package/src/public-api/buzz-integration.mjs +0 -256
- package/src/public-api/connect-agent.mjs +0 -416
- package/src/public-api/grants.mjs +0 -142
- package/src/public-api/http.mjs +0 -389
- package/src/public-control/aa-adapter.mjs +0 -402
- package/src/public-control/build-registry.mjs +0 -227
- package/src/public-control/bundler-client.mjs +0 -357
- package/src/public-control/grant-indexer.mjs +0 -296
- package/src/public-control/policy-render.mjs +0 -69
- package/src/public-control/policy-schema.mjs +0 -318
- package/src/public-control/runtime-config.mjs +0 -275
- package/src/public-control/session-key-model.mjs +0 -374
- package/src/public-control/session-orchestrator.mjs +0 -412
- package/src/rfq/intent.mjs +0 -180
- package/src/rfq/sources.mjs +0 -181
- package/src/route-attestation.mjs +0 -132
- package/src/router/best-execution.mjs +0 -326
- package/src/router/index.mjs +0 -226
- package/src/router/prepare-bridge.mjs +0 -289
- package/src/router/prepare-route.mjs +0 -398
- package/src/router/proposal.mjs +0 -311
- package/src/router/risk-classifier.mjs +0 -119
- package/src/router/route-sources.mjs +0 -364
- package/src/scanner/chains.config.mjs +0 -430
- package/src/scanner/contract.mjs +0 -270
- package/src/scanner/evm-scanner.mjs +0 -394
- package/src/scanner/index.mjs +0 -9
- package/src/scanner/v2-venue.mjs +0 -335
- package/src/scanner/v3-venue.mjs +0 -290
- package/src/scopes.mjs +0 -44
- package/src/sell-simulation.mjs +0 -167
- package/src/signals/engine.mjs +0 -146
- package/src/signals/index.mjs +0 -1
- package/src/token-transfer-guard.mjs +0 -188
- package/src/tui/app.mjs +0 -438
- package/src/tui/backend.mjs +0 -145
- package/src/tui/format.mjs +0 -272
- package/src/tui/gateway-client.mjs +0 -177
- package/src/tui/input.mjs +0 -501
- package/src/tui/renderer.mjs +0 -443
- package/src/tui/standalone-client.mjs +0 -666
- package/src/tui/theme.mjs +0 -81
- package/src/vault-attestation.mjs +0 -146
- package/src/venues.mjs +0 -206
- package/src/watch-preferences.mjs +0 -85
package/docs/adding-a-chain.md
DELETED
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
# Adding a chain
|
|
2
|
-
|
|
3
|
-
Oracle treats a chain as **configuration**. You do not write an integration.
|
|
4
|
-
|
|
5
|
-
## The short version
|
|
6
|
-
|
|
7
|
-
```js
|
|
8
|
-
import { registerCustomChain } from "@oracle-agent/oracle/scanner";
|
|
9
|
-
|
|
10
|
-
registerCustomChain({
|
|
11
|
-
key: "mychain",
|
|
12
|
-
chainId: 7777,
|
|
13
|
-
name: "My Chain",
|
|
14
|
-
rpcEnv: ["MYCHAIN_RPC_URL"],
|
|
15
|
-
nativeCurrency: { symbol: "MYC", decimals: 18 },
|
|
16
|
-
});
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
That chain now has block reads, native and ERC-20 balances, on-chain token
|
|
20
|
-
resolution, log scanning, and structural risk checks. No code was written.
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
export MYCHAIN_RPC_URL=https://rpc.mychain.example
|
|
24
|
-
oracle-scan head mychain
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Config fields
|
|
28
|
-
|
|
29
|
-
| Field | Required | Notes |
|
|
30
|
-
|---|---|---|
|
|
31
|
-
| `key` | yes | lowercase slug, used on the CLI |
|
|
32
|
-
| `chainId` | yes | positive integer |
|
|
33
|
-
| `name` | yes | display name |
|
|
34
|
-
| `rpcEnv` | yes | env var names, `UPPER_SNAKE`. Never a literal URL |
|
|
35
|
-
| `nativeCurrency` | no | `{ symbol, decimals }` |
|
|
36
|
-
| `explorer` | no | base URL |
|
|
37
|
-
| `dexscreenerSlug` | no | enables pool discovery — see below |
|
|
38
|
-
| `venues` | no | verified routers/quoters — required for routing value |
|
|
39
|
-
|
|
40
|
-
**RPC URLs live in the environment, never in config.** A repo carrying an endpoint
|
|
41
|
-
is both a leak and a rate-limit problem for whoever else uses that key.
|
|
42
|
-
|
|
43
|
-
## Why `dexscreenerSlug` matters
|
|
44
|
-
|
|
45
|
-
Pool discovery goes through market data rather than walking a factory. A factory
|
|
46
|
-
walk finds pools that *exist*; a trader needs pools with *liquidity*.
|
|
47
|
-
|
|
48
|
-
The slug is DexScreener's own chain identifier — not the chain id, and not always
|
|
49
|
-
the obvious name. If you don't know it, **leave it out**. Pool discovery then
|
|
50
|
-
reports `UNAVAILABLE`, which is honest. A wrong slug silently returns another
|
|
51
|
-
chain's pools, which is worse than no answer.
|
|
52
|
-
|
|
53
|
-
## Adding venues (routing value)
|
|
54
|
-
|
|
55
|
-
A chain with no verified venue is **fail-closed**: read and research work, routing
|
|
56
|
-
value does not. That is a safe default, not a gap.
|
|
57
|
-
|
|
58
|
-
To enable routing you must record *provenance*:
|
|
59
|
-
|
|
60
|
-
```js
|
|
61
|
-
venues: [
|
|
62
|
-
{
|
|
63
|
-
kind: "router",
|
|
64
|
-
address: "0x...",
|
|
65
|
-
verified: {
|
|
66
|
-
method: "eth_getCode + protocol /chains API",
|
|
67
|
-
source: "https://li.quest/v1/chains",
|
|
68
|
-
date: "2026-07-30",
|
|
69
|
-
},
|
|
70
|
-
},
|
|
71
|
-
]
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Validation **refuses** a venue without `verified`. This is not bureaucracy: the
|
|
75
|
-
destination allowlist is the highest-leverage control in the system, and
|
|
76
|
-
allowlisting a spoofed router makes every other guard irrelevant.
|
|
77
|
-
|
|
78
|
-
### How to actually verify
|
|
79
|
-
|
|
80
|
-
1. **Bytecode exists** — `eth_getCode` must return real code. `0x` means nothing is
|
|
81
|
-
deployed at that address on that chain.
|
|
82
|
-
2. **The protocol's own API or docs** names that address, for that chain, today.
|
|
83
|
-
Query the source (e.g. LI.FI's `/v1/chains` returns each chain's official
|
|
84
|
-
`diamondAddress`) rather than trusting a blog post or a model's recollection.
|
|
85
|
-
3. **Constructor-bound addresses match** — read `factory()`, `WETH9()` back off the
|
|
86
|
-
deployed contract and confirm they're what you expect.
|
|
87
|
-
4. **Per chain, separately.** An address verified on Arbitrum is not verified on
|
|
88
|
-
Ethereum, even when the canonical deployment shares an address across chains.
|
|
89
|
-
|
|
90
|
-
Record how and when. The audit trail has to outlive your session.
|
|
91
|
-
|
|
92
|
-
## Capabilities
|
|
93
|
-
|
|
94
|
-
Ten capabilities exist. The generic EVM scanner provides seven out of the box:
|
|
95
|
-
|
|
96
|
-
| Capability | Generic? | Why |
|
|
97
|
-
|---|---|---|
|
|
98
|
-
| `blockNumber` | yes | standard RPC |
|
|
99
|
-
| `nativeBalance` | yes | standard RPC |
|
|
100
|
-
| `tokenBalance` | yes | ERC-20 is ERC-20 |
|
|
101
|
-
| `resolveToken` | yes | reads metadata off the contract |
|
|
102
|
-
| `resolvePools` | yes* | needs `dexscreenerSlug` |
|
|
103
|
-
| `scanBlocks` | yes | chunked `eth_getLogs` |
|
|
104
|
-
| `scoreRisk` | yes | structural checks |
|
|
105
|
-
| `quote` | venue | needs a verified router |
|
|
106
|
-
| `sellSimulation` | venue | needs a verified router |
|
|
107
|
-
| `prepareUnsignedTx` | venue | needs a verified router |
|
|
108
|
-
|
|
109
|
-
Calling an unimplemented capability **throws**, naming what is supported. It never
|
|
110
|
-
returns `undefined` that a caller could mistake for "no result."
|
|
111
|
-
|
|
112
|
-
## Enabling quote / sell / prepare
|
|
113
|
-
|
|
114
|
-
Add a verified router plus two fields:
|
|
115
|
-
|
|
116
|
-
```js
|
|
117
|
-
{
|
|
118
|
-
key: "base",
|
|
119
|
-
chainId: 8453,
|
|
120
|
-
// ...
|
|
121
|
-
venueKind: "uniswap-v2",
|
|
122
|
-
wrappedNative: "0x4200000000000000000000000000000000000006",
|
|
123
|
-
venues: [{ kind: "router", address: "0x...", verified: { /* ... */ } }],
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
`src/scanner/chains.config.mjs` ships **Base** wired this way as the reference. It
|
|
128
|
-
gets all 10 capabilities; every other built-in stays at 7 and fail-closed until
|
|
129
|
-
someone verifies a venue for it.
|
|
130
|
-
|
|
131
|
-
What you get:
|
|
132
|
-
|
|
133
|
-
- **`quote`** — live exact-input pricing via `getAmountsOut`
|
|
134
|
-
- **`sellSimulation`** — a state-free round trip (buy then sell back) that catches
|
|
135
|
-
the honeypot signature: buy leg quotes fine, sell leg fails. This is the single
|
|
136
|
-
most valuable check on a low-cap venue, because most losses are not bad entries
|
|
137
|
-
but tokens that cannot be exited
|
|
138
|
-
- **`prepareUnsignedTx`** — an **unsigned** swap with a `minOut` computed from the
|
|
139
|
-
live quote, a deadline, and an explicit `approve` step listed separately so
|
|
140
|
-
"approved" and "swapped" are never collapsed into one claim
|
|
141
|
-
|
|
142
|
-
`scoreRisk` also upgrades automatically: with a router it reports real sellability
|
|
143
|
-
instead of `UNKNOWN`.
|
|
144
|
-
|
|
145
|
-
### The slippage ceiling is hard
|
|
146
|
-
|
|
147
|
-
A supplied `slippageBps` is a **maximum**, capped at 100 bps. Above that,
|
|
148
|
-
`prepareUnsignedTx` throws rather than widening:
|
|
149
|
-
|
|
150
|
-
```
|
|
151
|
-
slippageBps 250 exceeds the 100 bps ceiling. Block and requote or split
|
|
152
|
-
the order -- do not widen the guard to force a fill.
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
A cap that yields under pressure is decoration.
|
|
156
|
-
|
|
157
|
-
### V3 / V4 / custom quoters
|
|
158
|
-
|
|
159
|
-
Two adapters ship:
|
|
160
|
-
|
|
161
|
-
| `venueKind` | Requires | Prices via |
|
|
162
|
-
|---|---|---|
|
|
163
|
-
| `uniswap-v2` | `router` | `getAmountsOut` on the router |
|
|
164
|
-
| `uniswap-v3` | `quoter` **and** `router` | `quoteExactInputSingle` on QuoterV2 |
|
|
165
|
-
|
|
166
|
-
V3 is **not** V2 with different addresses: it has no `getAmountsOut`, prices through
|
|
167
|
-
a separate Quoter contract, and needs an explicit fee tier per hop. Encoding a V3
|
|
168
|
-
swap with V2 assumptions yields a transaction that reverts, or worse routes through
|
|
169
|
-
the wrong pool. That is why they are sibling adapters.
|
|
170
|
-
|
|
171
|
-
The V3 adapter searches all four fee tiers (100 / 500 / 3000 / 10000) and keeps the
|
|
172
|
-
best. This is necessary, not a nicety — liquidity concentrates in one tier and which
|
|
173
|
-
tier varies by pair and chain. On Arbitrum WETH→USDC the 500 tier returns ~2.4% more
|
|
174
|
-
than the 100 tier; defaulting to 0.3% because it is the common choice silently
|
|
175
|
-
misprices stable and exotic pairs alike.
|
|
176
|
-
|
|
177
|
-
A V3 chain needs **both** a quoter and a router. A router alone stays fail-closed:
|
|
178
|
-
it could encode a swap, but with no priced expectation to guard against — exactly
|
|
179
|
-
the state that produces an unbounded fill.
|
|
180
|
-
|
|
181
|
-
**V4 and custom-quoter venues still need their own adapter.** Some forks require an
|
|
182
|
-
off-chain signed quote you cannot produce locally. Write a sibling module rather
|
|
183
|
-
than bending an existing one; silently mis-encoding a swap is far worse than
|
|
184
|
-
declaring the capability unsupported.
|
|
185
|
-
|
|
186
|
-
### Verifying a venue: run the prober
|
|
187
|
-
|
|
188
|
-
`scripts/verify-v3-venues.mjs` probes candidate addresses on every chain and prints
|
|
189
|
-
a pass/fail with the live price it got:
|
|
190
|
-
|
|
191
|
-
```bash
|
|
192
|
-
node scripts/verify-v3-venues.mjs
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
**Codesize is not verification.** The canonical mainnet QuoterV2 address returns
|
|
196
|
-
2109 bytes of bytecode on Base — it is *some* contract, just not a working quoter
|
|
197
|
-
for that chain. A codesize check waves it through; the functional probe caught it
|
|
198
|
-
and pointed at Base's real quoter (8273 bytes, prices WETH→USDC correctly).
|
|
199
|
-
|
|
200
|
-
The rule: **a contract that correctly prices a pair you can sanity-check IS the
|
|
201
|
-
thing you think it is.** Anything less is a guess with an address attached.
|
|
202
|
-
|
|
203
|
-
## Honest evidence
|
|
204
|
-
|
|
205
|
-
Every finding carries a label. Respect the distinction:
|
|
206
|
-
|
|
207
|
-
- `LIVE` — read this call
|
|
208
|
-
- `CACHED` — recent, within stated TTL
|
|
209
|
-
- `STALE` — older than TTL; usable only with the caveat stated
|
|
210
|
-
- `UNKNOWN` — we tried and could not determine it
|
|
211
|
-
- `UNAVAILABLE` — this chain/provider cannot answer at all
|
|
212
|
-
|
|
213
|
-
`UNKNOWN` and `UNAVAILABLE` are different facts. Collapsing them is how people end
|
|
214
|
-
up sizing against stale reserves.
|
|
215
|
-
|
|
216
|
-
Risk verdicts are coarse on purpose — `PASS` / `CAUTION` / `FAIL` / `UNKNOWN`. A
|
|
217
|
-
score like "risk 62/100" invites trading a number nobody understands.
|
|
218
|
-
|
|
219
|
-
**`UNKNOWN` is not `PASS`.** The generic scanner returns `UNKNOWN` for sellability
|
|
220
|
-
because it cannot prove exitability without a verified router. A token is not
|
|
221
|
-
tradeable until a round-trip sell simulation succeeds.
|
|
222
|
-
|
|
223
|
-
## Contributing a chain upstream
|
|
224
|
-
|
|
225
|
-
Append to `CHAIN_CONFIGS` in `src/scanner/chains.config.mjs` and open a PR. Tests
|
|
226
|
-
already assert every built-in config validates and that none embeds an RPC URL, so
|
|
227
|
-
CI will catch a malformed entry.
|
|
228
|
-
|
|
229
|
-
If you add venues, put the verification method and date in the PR body.
|
package/docs/architecture.md
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
# Architecture
|
|
2
|
-
|
|
3
|
-
Three planes. The boundary between them is enforced by a test, not a convention.
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
user's wallet
|
|
7
|
-
^
|
|
8
|
-
| signs (only the user can)
|
|
9
|
-
|
|
|
10
|
-
+---------------------+---------------------+
|
|
11
|
-
| unsigned artifacts |
|
|
12
|
-
| |
|
|
13
|
-
| PUBLIC (this repo) |
|
|
14
|
-
| |
|
|
15
|
-
| data plane read / quote |
|
|
16
|
-
| policy plane allowlists, guards, |
|
|
17
|
-
| attestations, grants |
|
|
18
|
-
| control plane grant lifecycle, |
|
|
19
|
-
| session keys, AA, router |
|
|
20
|
-
+-------------------------------------------+
|
|
21
|
-
|
|
|
22
|
-
x no import may cross
|
|
23
|
-
|
|
|
24
|
-
+-------------------------------------------+
|
|
25
|
-
| OWNER-LOCAL (companion package) |
|
|
26
|
-
| @oracle-agent/operator |
|
|
27
|
-
| key-vault / hl-exec / oracle-vault |
|
|
28
|
-
+-------------------------------------------+
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Why three planes
|
|
32
|
-
|
|
33
|
-
The design assumption is that **the model can be wrong or adversarially steered**.
|
|
34
|
-
Everything follows from treating it as an untrusted proposer.
|
|
35
|
-
|
|
36
|
-
If the model is untrusted, then authorization cannot come from the model. It comes
|
|
37
|
-
from an owner signature over a bounded grant. And if authorization is separate from
|
|
38
|
-
proposal, then the code that proposes must be unable to reach the code that signs —
|
|
39
|
-
otherwise the separation is aspirational.
|
|
40
|
-
|
|
41
|
-
That is why the boundary is a test (`test/custody-boundary.test.mjs`) rather than a
|
|
42
|
-
paragraph in a README. It walks the import graph from every shipped entrypoint and
|
|
43
|
-
fails on:
|
|
44
|
-
|
|
45
|
-
- any public module importing signer or key material
|
|
46
|
-
- a dangling local import that reaches a signer from a shipped entrypoint
|
|
47
|
-
- a secret-shaped literal anywhere
|
|
48
|
-
- a packed npm artifact that still contains signer/vault modules
|
|
49
|
-
|
|
50
|
-
## Data plane
|
|
51
|
-
|
|
52
|
-
`src/data/` — 42 provider modules covering 219 unique protocols/venues, each
|
|
53
|
-
declaring an honest tier. One module can cover many protocols: the Jupiter
|
|
54
|
-
module alone routes 98 Solana venues.
|
|
55
|
-
|
|
56
|
-
| Tier | Meaning |
|
|
57
|
-
|---|---|
|
|
58
|
-
| `read-only` | data only; no execution claim |
|
|
59
|
-
| `quote-only` | can price a route; no reviewed transaction builder |
|
|
60
|
-
| `prepare` | returns a policy-bound unsigned transaction |
|
|
61
|
-
| `intent` | returns typed data to sign (CoW orders, GMX orders) |
|
|
62
|
-
|
|
63
|
-
The tier is load-bearing. "We support protocol X" is ambiguous and has caused real
|
|
64
|
-
confusion; the tier is not. **API coverage ≠ execution support.**
|
|
65
|
-
|
|
66
|
-
`src/data/catalog.mjs` is the registry; `dataHealth()` probes liveness. Note the
|
|
67
|
-
distinction in health output: a promise that resolved with `{ok: false}` is
|
|
68
|
-
*degraded*, not healthy — and an HTTP 200 serving an explorer error page is not a
|
|
69
|
-
successful read.
|
|
70
|
-
|
|
71
|
-
## Policy plane
|
|
72
|
-
|
|
73
|
-
The moat. Holds no keys; constrains what a signer may be asked to do.
|
|
74
|
-
|
|
75
|
-
- **Destination allowlist** (`src/venues.mjs`) — per chain, fail-closed. An empty
|
|
76
|
-
allowlist refuses everything. It never means "allow anything."
|
|
77
|
-
- **Auto-slippage** (`src/auto-slippage.mjs`) — a guard computed from live depth and
|
|
78
|
-
volatility per leg, recomputed before each broadcast. A caller-supplied tolerance
|
|
79
|
-
is a *maximum*, not the selected value. Hard ceiling 100 bps; over that, block and
|
|
80
|
-
requote rather than widen.
|
|
81
|
-
- **Attestations** (`route-`, `vault-`, `gmx-attestation.mjs`) — dynamic execution
|
|
82
|
-
targets require an attestation minted inside the trusted boundary. Model-authored
|
|
83
|
-
JSON is not authorization.
|
|
84
|
-
- **Approval guard** — exact-amount approvals, never unlimited by default, with
|
|
85
|
-
allowance read back after the approve lands.
|
|
86
|
-
|
|
87
|
-
Guards are re-checked at **sign and broadcast** time. A stale minimum is not a
|
|
88
|
-
minimum.
|
|
89
|
-
|
|
90
|
-
## Control plane
|
|
91
|
-
|
|
92
|
-
`src/public-control/` — grant schema and rendering, session-key model, ERC-4337
|
|
93
|
-
adapter, bundler client, grant indexer.
|
|
94
|
-
|
|
95
|
-
`src/router/` — model routing with a custody firewall. `risk-classifier.mjs` scores
|
|
96
|
-
an action's risk; `proposal.mjs` refuses to construct a proposal containing
|
|
97
|
-
dangerous fields (private keys, mnemonics, bearer tokens) at any nesting depth. The
|
|
98
|
-
router can propose, simulate, explain, and draft. It cannot authorize.
|
|
99
|
-
|
|
100
|
-
## Scanner framework
|
|
101
|
-
|
|
102
|
-
`src/scanner/` — makes a chain data rather than an integration.
|
|
103
|
-
|
|
104
|
-
- `contract.mjs` — 10 capabilities, a validator, a registry, coverage matrix
|
|
105
|
-
- `evm-scanner.mjs` — one generic implementation for any EVM JSON-RPC chain
|
|
106
|
-
- `chains.config.mjs` — the 11 built-ins as config, plus `registerCustomChain()`
|
|
107
|
-
|
|
108
|
-
Unimplemented capabilities are **absent, not faked**: calling one throws a message
|
|
109
|
-
naming what *is* supported. A caller can never mistake `undefined` for a negative
|
|
110
|
-
result.
|
|
111
|
-
|
|
112
|
-
Evidence labels (`LIVE` / `CACHED` / `STALE` / `UNKNOWN` / `UNAVAILABLE`) and risk
|
|
113
|
-
verdicts (`PASS` / `CAUTION` / `FAIL` / `UNKNOWN`) exist to stop the collapse that
|
|
114
|
-
causes losses: **`UNKNOWN` is not `PASS`**, and "we could not check" is a different
|
|
115
|
-
fact from "there is nothing there."
|
|
116
|
-
|
|
117
|
-
## Agent mesh
|
|
118
|
-
|
|
119
|
-
`profiles/` + `skills/` — seven installable Hermes lanes plus a template.
|
|
120
|
-
|
|
121
|
-
A lane is narrow on purpose: smaller context is cheaper and more accurate, per-lane
|
|
122
|
-
memory doesn't cross-contaminate, and a grant scoped to one lane can't be spent by
|
|
123
|
-
another.
|
|
124
|
-
|
|
125
|
-
Every lane ships DISARMED, and every grant action a lane may request is read,
|
|
126
|
-
simulate, or prepare. No lane may request broadcast or signing — enforced in
|
|
127
|
-
`test/profiles.test.mjs`, so widening custody cannot pass review quietly.
|
|
128
|
-
|
|
129
|
-
No lane pins a model. `profile.json` carries a capability *class*
|
|
130
|
-
(`strong-reasoner`, `fast-tool-caller`), so the installer never writes a vendor into
|
|
131
|
-
a user's config.
|
|
132
|
-
|
|
133
|
-
## What is not in the public package
|
|
134
|
-
|
|
135
|
-
House custody, an always-on exec server, and capability minting are not shipped.
|
|
136
|
-
Owner-local signer modules (`key-vault`, `hl-exec`, `oracle-vault`) live in the
|
|
137
|
-
companion package `@oracle-agent/operator` on the user's machine. This prepare
|
|
138
|
-
package has nothing to steal: it never takes a key and never broadcasts.
|
package/docs/cli.md
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# Oracle unified CLI
|
|
2
|
-
|
|
3
|
-
Root command: `oracle <noun> <verb> [args]`.
|
|
4
|
-
|
|
5
|
-
The public `@oracle-agent/oracle` package is **prepare-only**. Signing commands
|
|
6
|
-
dispatch to a separately installed `@oracle-agent/operator` process on the same
|
|
7
|
-
machine. Oracle never imports operator signing modules.
|
|
8
|
-
|
|
9
|
-
See also [connectors.md](./connectors.md).
|
|
10
|
-
|
|
11
|
-
## Exit codes
|
|
12
|
-
|
|
13
|
-
| Code | Meaning |
|
|
14
|
-
|---|---|
|
|
15
|
-
| 0 | ok |
|
|
16
|
-
| 1 | usage / general error |
|
|
17
|
-
| 2 | operator self-reported error |
|
|
18
|
-
| 3 | operator package not installed |
|
|
19
|
-
| 4 | data server not running |
|
|
20
|
-
|
|
21
|
-
## Chat surface
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
oracle # TTY: premium boxed oracle chat
|
|
25
|
-
oracle --help # command help
|
|
26
|
-
oracle model # interactive provider/model picker
|
|
27
|
-
oracle -m <model> # launch this session on a selected model
|
|
28
|
-
oracle chain list # working chains
|
|
29
|
-
oracle chain use hyperliquid
|
|
30
|
-
oracle setup # telegram/discord/slack messaging menu
|
|
31
|
-
oracle setup telegram # writes TELEGRAM_BOT_TOKEN into profile .env
|
|
32
|
-
oracle setup messaging # full hermes gateway setup wizard
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Inside chat:
|
|
36
|
-
|
|
37
|
-
- `/chain` list or select build/trade chain
|
|
38
|
-
- `/setup` configure messaging platforms
|
|
39
|
-
- `/model` switch models; persona stays oracle
|
|
40
|
-
|
|
41
|
-
Terminal and configured messaging channels are transports into the same Hermes
|
|
42
|
-
profile. A configured local operator/MCP can execute an owner-confirmed action
|
|
43
|
-
from either interface. The interface and selected model never bypass grants,
|
|
44
|
-
allowlists, caps, MAC checks, simulation, or receipt verification.
|
|
45
|
-
|
|
46
|
-
Hosted remote models stay read/prepare-only. Local hermes + operator remain the
|
|
47
|
-
only signing path, and only via child process.
|
package/docs/connectors.md
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Oracle AI-client connectors
|
|
2
|
-
|
|
3
|
-
ChatGPT is hosted and can NEVER sign or reach your keys. This connector is read/prepare only; anything it prepares is unsigned until you sign it locally.
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
oracle mcp print --target claude-code
|
|
7
|
-
oracle mcp install claude-code
|
|
8
|
-
oracle mcp install codex
|
|
9
|
-
oracle mcp install chatgpt
|
|
10
|
-
oracle mcp install claude-code --with-control # requires local operator
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Oracle does not create tunnels for hosted clients.
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Oracle protocol pack standard
|
|
2
|
-
|
|
3
|
-
An Oracle protocol pack is a package-safe ESM module that turns an intent into an unsigned action and decodes independently obtained receipts. A pack is an adapter, not a wallet, signer, broadcaster, or authority. See `examples/oracle-pack-template.mjs` for the smallest complete shape.
|
|
4
|
-
|
|
5
|
-
## Required surface
|
|
6
|
-
|
|
7
|
-
Every pack exports a default object with these members (named exports may mirror them):
|
|
8
|
-
|
|
9
|
-
- `provider`: stable provider identity, semantic version, supported chain IDs, and provenance/trust metadata. Remote token names, symbols, descriptions, image fields, URLs, and NFT metadata remain untrusted data.
|
|
10
|
-
- `prepare(intent)`: validates the intent and returns an unsigned transaction or typed action. It must not accept keys, sign, submit, broadcast, or report execution success.
|
|
11
|
-
- `decode(receipt)`: validates and converts a chain/provider receipt into a documented result. Unknown or malformed receipts fail closed.
|
|
12
|
-
- `riskRules`: an array or function describing enforceable limits and refusal conditions. Human-readable warnings alone are not rules.
|
|
13
|
-
- `tests`: non-empty metadata naming the local test command and covered properties. Tests must be deterministic and require no credentials or network.
|
|
14
|
-
|
|
15
|
-
## Prompt-injection boundary
|
|
16
|
-
|
|
17
|
-
Treat every provider response and token/NFT metadata string as inert data. Never concatenate metadata into system/developer instructions, interpret it as tool directions, or let it modify recipients, calldata, limits, and policy. Render or quote it through a data channel and retain its provenance. Packs should test adversarial values such as “ignore previous instructions,” requests for secrets, and demands to sign or invoke tools.
|
|
18
|
-
|
|
19
|
-
## Custody boundary
|
|
20
|
-
|
|
21
|
-
Pack exports must not expose signers, wallets, private keys, seed phrases, signing functions, transaction submission, or broadcasting. `prepare` returns data to a separately authorized custody surface. Environment variables and provider credentials must not appear in prepared output, logs, errors, fixtures, or metadata. Imports should be side-effect free; merely loading a pack must not make network calls.
|
|
22
|
-
|
|
23
|
-
## Receipt gate
|
|
24
|
-
|
|
25
|
-
Preparation is not execution. A prepared result declares a `receiptGate` and consumers must not mark an action successful until `decode` receives a receipt from an independent, trusted transport and verifies its chain, transaction identity, status, and required confirmations. Timeouts, pending receipts, mismatches, reverts, and undecodable responses are not success.
|
|
26
|
-
|
|
27
|
-
## Local adversarial benchmark
|
|
28
|
-
|
|
29
|
-
Run `node scripts/adversarial-bench.mjs <pack.mjs> [...]`. It imports only the named local modules, invokes no pack functions, emits one deterministic JSON summary, and exits `1` when a gate fails (`2` for usage/load errors). It checks required surface fields, forbidden custody exports, missing test metadata, and prompt-injection strings nested in provider or pack metadata. This static public gate complements, rather than replaces, behavioral tests of preparation and receipt verification.
|
package/docs/profiles.md
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
# Agent profiles
|
|
2
|
-
|
|
3
|
-
Oracle is not one agent. It's a mesh of specialists with a router in front.
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
you
|
|
7
|
-
|
|
|
8
|
-
Task
|
|
9
|
-
|
|
|
10
|
-
oracle <- routes, never authorizes custody
|
|
11
|
-
|
|
|
12
|
-
+------+------+------+------+------+------+------+
|
|
13
|
-
| | | | | | | |
|
|
14
|
-
poly hyper robin solana bitcoin stable protocol
|
|
15
|
-
market liquid hood builder
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Each lane is a [Hermes](https://github.com/NousResearch/hermes-agent) **profile**:
|
|
19
|
-
its own system prompt, skill set, memory, and session store. They share a wallet
|
|
20
|
-
policy and a receipts discipline, nothing else.
|
|
21
|
-
|
|
22
|
-
## Why profiles instead of one big agent
|
|
23
|
-
|
|
24
|
-
Three practical reasons, learned the hard way:
|
|
25
|
-
|
|
26
|
-
1. **Context stays small.** A Polymarket question shouldn't load Bitcoin
|
|
27
|
-
ordinals knowledge. Smaller context is cheaper, faster, and more accurate.
|
|
28
|
-
2. **Memory doesn't cross-contaminate.** What the perps lane learned about
|
|
29
|
-
funding rates should not leak into the NFT lane's judgment.
|
|
30
|
-
3. **Blast radius is bounded.** A grant scoped to one lane's venues can't be
|
|
31
|
-
spent by another.
|
|
32
|
-
|
|
33
|
-
## The lanes
|
|
34
|
-
|
|
35
|
-
| Profile | Owns | Typical grant |
|
|
36
|
-
|---|---|---|
|
|
37
|
-
| `oracle` | routing, synthesis, multi-chain comparison, `/balance` portfolio aggregation | read + simulate only |
|
|
38
|
-
| `polymarket-agent` | prediction markets, event odds, CLOB cards/API-key order intents | read, quote, prepare |
|
|
39
|
-
| `hyperliquid-agent` | perps, spot, HIP-3 builder dexs, HIP-4 outcomes | read, quote, prepare |
|
|
40
|
-
| `robinhood-agent` | Robinhood Chain (4663) tokens, NFTs, tokenized Robinhood-style assets, capped NFT mints | read, quote, prepare |
|
|
41
|
-
| `solana-agent` | Solana swaps, research, Jupiter routes | read, quote, prepare |
|
|
42
|
-
| `bitcoin-agent` | Bitcoin L1, Ordinals/runes, inscriptions | read, prepare:inscription |
|
|
43
|
-
| `stable-agent` | Stable (988), USDT-native gas quirks | read, quote, prepare |
|
|
44
|
-
| `protocol-builder` | scaffold, review, prepare chain-family token/NFT collections, gacha, DEX, and protocol deploys | prepare:deploy, prepare:mint, simulate |
|
|
45
|
-
| `_template` | your new lane | you decide |
|
|
46
|
-
|
|
47
|
-
These grants describe the public prepare plane, not every capability an operator may install beside it. The generic unattended signer exposes six bounded surfaces (`hl`, `poly`, `evm-swap`, `evm-bridge`, `btc`, `sol`), each of which decodes its own envelope and refuses while its allowlists are empty. A separately installed, same-host, owner-gated EVM executor may expose one exact bounded action after explicit `arm`; profiles must verify it before claiming availability. `watch`, `watch this`, and `ping me` remain `alert_only` regardless of executor presence.
|
|
48
|
-
|
|
49
|
-
`protocol-builder` classifies each launch by chain family, then designs and
|
|
50
|
-
prepares unsigned token, NFT collection, protocol, or mint-bot transactions. It
|
|
51
|
-
fails closed when no verified adapter exists, never house-signs, and keeps deploy,
|
|
52
|
-
metadata, liquidity, mint, and authority actions as separate user approvals.
|
|
53
|
-
|
|
54
|
-
The root `oracle` lane owns `/balance`, natural-language balance, and portfolio
|
|
55
|
-
history requests. Its `balance` skill calls the read-only
|
|
56
|
-
`portfolio_snapshot` MCP tool once, records a compact profile-local observation,
|
|
57
|
-
reports partial coverage and unavailable providers, and labels `knownUsd` as
|
|
58
|
-
incomplete instead of inventing a full portfolio total. `portfolio_history`
|
|
59
|
-
reads those observations and `portfolio_value_graph` renders the known-value
|
|
60
|
-
series while omitting unavailable values rather than plotting fake zeroes.
|
|
61
|
-
|
|
62
|
-
## Model choice is yours
|
|
63
|
-
|
|
64
|
-
Oracle makes **no model calls**. It has no LLM client, no API key, no inference
|
|
65
|
-
dependency — its runtime deps are `ethers`, `viem`, and three `@noble`/`@scure`
|
|
66
|
-
crypto libraries. Every lane inherits whatever provider your Hermes is configured
|
|
67
|
-
with.
|
|
68
|
-
|
|
69
|
-
So there is nothing to sign up for. If Hermes already talks to a model, Oracle
|
|
70
|
-
works.
|
|
71
|
-
|
|
72
|
-
What profiles *do* give you is **per-lane** model choice, because each profile has
|
|
73
|
-
its own `config.yaml`:
|
|
74
|
-
|
|
75
|
-
```yaml
|
|
76
|
-
# ~/.hermes/profiles/<name>/config.yaml
|
|
77
|
-
model:
|
|
78
|
-
provider: anthropic # or openai-codex, nous, xai-oauth, a local model...
|
|
79
|
-
default: claude-opus-5
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
That lets you put a heavy reasoner on the router and something cheap and fast on
|
|
83
|
-
a polling lane:
|
|
84
|
-
|
|
85
|
-
| Lane | Wants | Why |
|
|
86
|
-
|---|---|---|
|
|
87
|
-
| `oracle` | strongest reasoner | routing and synthesis need judgment |
|
|
88
|
-
| `protocol-builder` | strongest reasoner | contract review is unforgiving |
|
|
89
|
-
| `hyperliquid-agent` | fast, numeric, tool-heavy | many small tool calls |
|
|
90
|
-
| `polymarket-agent` | news-shaped reasoning | event pricing is narrative |
|
|
91
|
-
| research fan-out | cheap and parallel | breadth over depth |
|
|
92
|
-
|
|
93
|
-
Starting point, not doctrine. Benchmark on your own workload.
|
|
94
|
-
|
|
95
|
-
### If you want one login for many models
|
|
96
|
-
|
|
97
|
-
Optional convenience, not a requirement: [Nous
|
|
98
|
-
Portal](https://nousresearch.com) fronts the frontier set (Claude, GPT, Grok,
|
|
99
|
-
DeepSeek, Qwen and more) behind a single Hermes credential, so each lane can pick
|
|
100
|
-
a different model without five separate API keys and five bills.
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
hermes auth add nous
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Any Hermes-supported provider works equally well. Oracle does not care.
|
|
107
|
-
|
|
108
|
-
## Creating a lane
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
hermes profile create polymarket-agent
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Then give it a `SOUL.md` (who it is, what it owns, what it must refuse) and a
|
|
115
|
-
`config.yaml` (model + provider). Point it at Oracle's MCP read plane.
|
|
116
|
-
|
|
117
|
-
`oracle-init --apply` writes this for you. Manual form (Hermes wants command and
|
|
118
|
-
args as separate tokens):
|
|
119
|
-
|
|
120
|
-
```bash
|
|
121
|
-
# terminal 1 — local read plane the MCP tools call
|
|
122
|
-
npx oracle-data
|
|
123
|
-
|
|
124
|
-
# terminal 2 — wire MCP into a lane
|
|
125
|
-
hermes -p polymarket-agent mcp add oracle-data --command oracle-data-mcp
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
Now that lane can read 42 provider modules covering 219 protocols/venues across
|
|
129
|
-
EVM, Solana, and Bitcoin, quote real routes, and
|
|
130
|
-
prepare unsigned transactions — and it still cannot sign anything.
|
|
131
|
-
|
|
132
|
-
## Posture
|
|
133
|
-
|
|
134
|
-
Every lane starts `DISARMED`. Arming is a deliberate, scoped, expiring act:
|
|
135
|
-
|
|
136
|
-
```
|
|
137
|
-
grant:
|
|
138
|
-
chain: 8453
|
|
139
|
-
actions: [read:chain, simulate:tx, prepare:swap]
|
|
140
|
-
targets: [<router address>]
|
|
141
|
-
maxValueWei: <cap>
|
|
142
|
-
expiresAt: <unix ts>
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
An action outside the grant is refused, not negotiated. When the grant expires,
|
|
146
|
-
the lane goes back to reading.
|
|
147
|
-
|
|
148
|
-
## A rule worth keeping
|
|
149
|
-
|
|
150
|
-
Give a lane the narrowest grant that makes it useful, and let it expire. A
|
|
151
|
-
permanent broad grant is just a hot wallet with extra steps.
|