@oracle-agent/oracle 0.10.0 → 0.12.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 +82 -91
- package/SECURITY.md +37 -12
- package/SETUP.md +207 -272
- package/dist/action-receipts.mjs +1 -0
- package/dist/action-semantics.mjs +1 -0
- package/dist/address-book.mjs +2 -0
- package/dist/bin/desk-server.mjs +14 -0
- package/dist/bin/oracle-data-mcp.mjs +8 -0
- package/dist/bin/oracle-init.mjs +24 -0
- package/dist/bin/oracle-public-server.mjs +5 -0
- package/dist/bin/oracle-route.mjs +22 -0
- package/dist/bin/oracle-scan.mjs +18 -0
- package/dist/bin/oracle-upgrade.mjs +21 -0
- package/dist/bin/oracle.mjs +68 -0
- package/dist/chains.mjs +1 -0
- package/dist/cli/commands/auth.mjs +16 -0
- package/dist/cli/commands/bootstrap.mjs +18 -0
- package/dist/cli/commands/chain.mjs +21 -0
- package/dist/cli/commands/chat.mjs +35 -0
- package/dist/cli/commands/credential.mjs +1 -0
- package/dist/cli/commands/data-mcp.mjs +2 -0
- package/dist/cli/commands/data.mjs +12 -0
- package/dist/cli/commands/doctor.mjs +5 -0
- package/dist/cli/commands/gate.mjs +13 -0
- package/dist/cli/commands/help.mjs +1 -0
- package/dist/cli/commands/init.mjs +3 -0
- package/dist/cli/commands/mcp.mjs +33 -0
- package/dist/cli/commands/model.mjs +44 -0
- package/dist/cli/commands/prepare.mjs +2 -0
- package/dist/cli/commands/public.mjs +3 -0
- package/dist/cli/commands/route.mjs +2 -0
- package/dist/cli/commands/runner.mjs +1 -0
- package/dist/cli/commands/scan.mjs +2 -0
- package/dist/cli/commands/setup.mjs +34 -0
- package/dist/cli/commands/sign.mjs +4 -0
- package/dist/cli/commands/signer.mjs +1 -0
- package/dist/cli/commands/upgrade.mjs +2 -0
- package/dist/cli/commands/vault.mjs +1 -0
- package/dist/cli/commands/version.mjs +2 -0
- package/dist/data/desk-data.mjs +12 -0
- package/dist/index.mjs +17 -0
- package/dist/nft-gas-war-guard.mjs +1 -0
- package/dist/onboarding/harness-configs.mjs +4 -0
- package/dist/portfolio-risk.mjs +1 -0
- package/dist/prepare-envelope.mjs +1 -0
- package/dist/public-control/policy-schema.mjs +1 -0
- package/dist/router/index.mjs +2 -0
- package/dist/scanner/index.mjs +4 -0
- package/dist/signals/index.mjs +1 -0
- package/dist/watch-preferences.mjs +1 -0
- package/package.json +27 -65
- package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +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/index.html +246 -169
- package/CONTRIBUTING.md +0 -98
- package/bin/desk-server.mjs +0 -440
- package/bin/oracle-data-mcp.mjs +0 -1010
- 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/bin/oracle.mjs +0 -33
- package/docs/adding-a-chain.md +0 -229
- package/docs/architecture.md +0 -136
- 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 -154
- 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/scripts/adversarial-bench.mjs +0 -114
- package/scripts/build-inscription.py +0 -230
- package/scripts/check-doc-drift.mjs +0 -112
- 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 -168
- 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 -73
- package/src/cli/commands/doctor.mjs +0 -126
- 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 -554
- package/src/data/desk-data.mjs +0 -683
- 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 -222
- 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.mjs +0 -183
- package/src/data/providers/lifi.mjs +0 -151
- package/src/data/providers/magiceden-sol.mjs +0 -393
- package/src/data/providers/morpho.mjs +0 -173
- 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 -187
- 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 -338
- package/src/data/providers/solana-rpc.mjs +0 -197
- package/src/data/providers/uniswap-v3.mjs +0 -320
- 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 -186
- 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 -381
- package/src/router/proposal.mjs +0 -311
- package/src/router/risk-classifier.mjs +0 -119
- package/src/router/route-sources.mjs +0 -329
- 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
|
@@ -1,192 +0,0 @@
|
|
|
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
|
-
43114: {
|
|
77
|
-
name: "avalanche",
|
|
78
|
-
quoter: "0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",
|
|
79
|
-
router: "0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",
|
|
80
|
-
tokenIn: "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7", // WAVAX
|
|
81
|
-
tokenOut: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", // USDC
|
|
82
|
-
decIn: 18,
|
|
83
|
-
decOut: 6,
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const FEE_TIERS = [500, 3000, 10000];
|
|
88
|
-
|
|
89
|
-
const word = (v) => BigInt(v).toString(16).padStart(64, "0");
|
|
90
|
-
const addrWord = (a) => a.slice(2).toLowerCase().padStart(64, "0");
|
|
91
|
-
|
|
92
|
-
// QuoterV2.quoteExactInputSingle((address,address,uint256,uint24,uint160))
|
|
93
|
-
// selector 0xc6a5026a -- struct is encoded inline as 5 words.
|
|
94
|
-
function encodeQuote({ tokenIn, tokenOut, amountIn, fee }) {
|
|
95
|
-
return (
|
|
96
|
-
"0xc6a5026a" +
|
|
97
|
-
addrWord(tokenIn) +
|
|
98
|
-
addrWord(tokenOut) +
|
|
99
|
-
word(amountIn) +
|
|
100
|
-
word(fee) +
|
|
101
|
-
word(0) // sqrtPriceLimitX96 = 0 (no limit)
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
async function codesize(chainId, address) {
|
|
106
|
-
const r = await rpcCall(chainId, "eth_getCode", [address, "latest"]).catch(() => null);
|
|
107
|
-
const raw = r?.result ?? r;
|
|
108
|
-
return raw && raw !== "0x" ? (raw.length - 2) / 2 : 0;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
async function probe(chainId, cfg) {
|
|
112
|
-
const result = {
|
|
113
|
-
chainId: Number(chainId),
|
|
114
|
-
name: cfg.name,
|
|
115
|
-
quoter: cfg.quoter,
|
|
116
|
-
router: cfg.router,
|
|
117
|
-
quoterCodesize: 0,
|
|
118
|
-
routerCodesize: 0,
|
|
119
|
-
workingFeeTier: null,
|
|
120
|
-
quotedOut: null,
|
|
121
|
-
humanPrice: null,
|
|
122
|
-
verdict: "FAIL",
|
|
123
|
-
reason: "",
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
result.quoterCodesize = await codesize(chainId, cfg.quoter);
|
|
127
|
-
result.routerCodesize = await codesize(chainId, cfg.router);
|
|
128
|
-
|
|
129
|
-
if (!result.quoterCodesize || !result.routerCodesize) {
|
|
130
|
-
result.reason = "no bytecode at candidate address on this chain";
|
|
131
|
-
return result;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Behavioural probe: does it actually price a pair we can sanity-check?
|
|
135
|
-
const amountIn = 10n ** BigInt(cfg.decIn);
|
|
136
|
-
for (const fee of FEE_TIERS) {
|
|
137
|
-
const data = encodeQuote({
|
|
138
|
-
tokenIn: cfg.tokenIn,
|
|
139
|
-
tokenOut: cfg.tokenOut,
|
|
140
|
-
amountIn,
|
|
141
|
-
fee,
|
|
142
|
-
});
|
|
143
|
-
const r = await rpcCall(chainId, "eth_call", [{ to: cfg.quoter, data }, "latest"]).catch(
|
|
144
|
-
() => null,
|
|
145
|
-
);
|
|
146
|
-
const raw = r?.result ?? r;
|
|
147
|
-
if (!raw || raw === "0x" || raw.length < 66) continue;
|
|
148
|
-
|
|
149
|
-
const out = BigInt(`0x${raw.slice(2, 66)}`);
|
|
150
|
-
if (out === 0n) continue;
|
|
151
|
-
|
|
152
|
-
result.workingFeeTier = fee;
|
|
153
|
-
result.quotedOut = out.toString();
|
|
154
|
-
result.humanPrice = Number(out) / 10 ** cfg.decOut;
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (result.workingFeeTier == null) {
|
|
159
|
-
result.reason = "bytecode present but no fee tier returned a quote -- not a working V3 quoter";
|
|
160
|
-
return result;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Sanity band. A working quoter on a major pair should land in a plausible range;
|
|
164
|
-
// a wildly wrong number means we are talking to the wrong contract or decoding it
|
|
165
|
-
// wrong, and either way it must not be allowlisted.
|
|
166
|
-
if (result.humanPrice <= 0 || !Number.isFinite(result.humanPrice)) {
|
|
167
|
-
result.reason = `implausible quote ${result.humanPrice}`;
|
|
168
|
-
return result;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
result.verdict = "PASS";
|
|
172
|
-
result.reason =
|
|
173
|
-
`quoteExactInputSingle at fee ${result.workingFeeTier} returned ` +
|
|
174
|
-
`${result.humanPrice} for 1 unit in -- a live, working V3 quote`;
|
|
175
|
-
return result;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
const out = [];
|
|
179
|
-
for (const [chainId, cfg] of Object.entries(CANDIDATES)) {
|
|
180
|
-
const r = await probe(chainId, cfg);
|
|
181
|
-
out.push(r);
|
|
182
|
-
const line =
|
|
183
|
-
`${r.name.padEnd(10)} ${r.verdict.padEnd(5)} ` +
|
|
184
|
-
`quoter=${String(r.quoterCodesize).padStart(6)} router=${String(r.routerCodesize).padStart(6)} ` +
|
|
185
|
-
(r.workingFeeTier ? `fee=${String(r.workingFeeTier).padStart(5)} price=${r.humanPrice}` : r.reason);
|
|
186
|
-
console.log(line);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
console.log(`\n${out.filter((r) => r.verdict === "PASS").length}/${out.length} chains verified`);
|
|
190
|
-
if (process.argv.includes("--json")) {
|
|
191
|
-
console.log(JSON.stringify(out, null, 2));
|
|
192
|
-
}
|
package/skills/balance/SKILL.md
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
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.
|
|
@@ -1,40 +0,0 @@
|
|
|
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.
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: oracle-best-execution
|
|
3
|
-
description: Use whenever swapping or bridging. The rule that the highest quote is not the cheapest trade, and how to compare routes honestly.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Best execution
|
|
7
|
-
|
|
8
|
-
The biggest `amountOut` is not the best route. Rank on **net received after gas and
|
|
9
|
-
fees**, every time.
|
|
10
|
-
|
|
11
|
-
## Get the comparison
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
best_swap_route { chainId, tokenIn, tokenOut, amountIn, decimalsIn, decimalsOut }
|
|
15
|
-
best_bridge_route { fromChainId, toChainId, tokenIn, tokenOut, amountIn }
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Or at a shell:
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
oracle-route swap base <tokenIn> <tokenOut> [amountIn]
|
|
22
|
-
oracle-route bridge arbitrum base [token] [amountIn]
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Read the result properly
|
|
26
|
-
|
|
27
|
-
Report the winner **and** the runners-up. A user who sees only the winner cannot tell
|
|
28
|
-
whether it won by 0.01% or 3%, and that difference decides whether the route is worth
|
|
29
|
-
any extra risk.
|
|
30
|
-
|
|
31
|
-
Three fields carry most of the meaning:
|
|
32
|
-
|
|
33
|
-
- **`rankedOn`** — `net-of-cost` means gas was accounted for. `gross` means it was
|
|
34
|
-
**not**, and the ordering may be wrong.
|
|
35
|
-
- **`costAccounted`** (per route) — `false` means that route's gas is unknown. It is
|
|
36
|
-
ranked on gross, which **flatters it**. Say so.
|
|
37
|
-
- **`improvementBps`** — `null` means no honest spread exists, usually because the
|
|
38
|
-
top two routes measure cost differently. Do not invent one.
|
|
39
|
-
|
|
40
|
-
## What to say
|
|
41
|
-
|
|
42
|
-
Good: *"ParaSwap nets 1903.88 USDC after $0.01 gas. CoW is 0.01% behind but gasless,
|
|
43
|
-
so on a larger size it likely wins. LI.FI quotes competitively but $4.78 of gas puts
|
|
44
|
-
it 0.5% down."*
|
|
45
|
-
|
|
46
|
-
Bad: *"Best route: LI.FI, 1899 USDC."* — that is the gross number, and it lost.
|
|
47
|
-
|
|
48
|
-
## Preparing the winner
|
|
49
|
-
|
|
50
|
-
`prepare_best_route` compares, then builds the signable artifact for the winner:
|
|
51
|
-
|
|
52
|
-
```
|
|
53
|
-
prepare_best_route { chainId, tokenIn, tokenOut, amountIn, taker }
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
`taker` must be the **real wallet that will sign**. Quoting is anonymous; preparing
|
|
57
|
-
is not. Placeholder and burn addresses are rejected.
|
|
58
|
-
|
|
59
|
-
**Check `artifactKind` before telling the user what to do.** They are not
|
|
60
|
-
interchangeable:
|
|
61
|
-
|
|
62
|
-
- `unsigned-transaction` (LI.FI, ParaSwap, 0x) — sign and **broadcast** it.
|
|
63
|
-
- `typed-data-order` (CoW) — sign the data and **submit it to the CoW API**. There is
|
|
64
|
-
nothing to broadcast. Signing authorizes a solver to settle on your behalf.
|
|
65
|
-
|
|
66
|
-
**Approval comes first, and the spender is not always the destination.** For CoW the
|
|
67
|
-
approval goes to the *vault relayer*, not the settlement contract — approving the
|
|
68
|
-
wrong one produces an order that silently never fills. Read `requiresApproval.spender`
|
|
69
|
-
rather than assuming it equals `destination`.
|
|
70
|
-
|
|
71
|
-
Some venues refuse to build calldata until the approval already exists on-chain
|
|
72
|
-
(ParaSwap does). That surfaces as `failureKind: "approval-required-first"`, which is
|
|
73
|
-
a real ordering constraint, not a bug: approve, then prepare again.
|
|
74
|
-
|
|
75
|
-
If the winner has no prepare path, the result names an `alternative`. Say that the
|
|
76
|
-
winner could not be prepared and what you used instead — do not silently substitute.
|
|
77
|
-
|
|
78
|
-
**Read `driftBps`.** Prepare re-quotes, so this is how far the route moved since the
|
|
79
|
-
comparison. A large negative number means the ranking may no longer hold.
|
|
80
|
-
|
|
81
|
-
## Preparing a bridge
|
|
82
|
-
|
|
83
|
-
`prepare_best_bridge_route` — same idea, different hazards.
|
|
84
|
-
|
|
85
|
-
**`transactions` is always a list.** Some routes need an approval *and* a deposit,
|
|
86
|
-
signed in order. Tell the user how many and that order matters: signing only the
|
|
87
|
-
first leaves funds approved but not bridged.
|
|
88
|
-
|
|
89
|
-
**Two chains are in play.** Every transaction executes on `fromChainId`; the value
|
|
90
|
-
lands on `toChainId`. Report both. A prepared artifact whose transaction chain does
|
|
91
|
-
not match the origin is refused outright (`failureKind: "chain-mismatch"`).
|
|
92
|
-
|
|
93
|
-
**Bridging is not atomic — say so unprompted.** The origin transaction confirming does
|
|
94
|
-
**not** mean funds arrived. Give the `durationSeconds` estimate and tell the user not
|
|
95
|
-
to re-send while pending. This is the single most common bridging panic, and silence
|
|
96
|
-
here causes double-sends.
|
|
97
|
-
|
|
98
|
-
**Across quotes but cannot be prepared** in this build. It often wins on gross because
|
|
99
|
-
its gas is unreported, so expect `failureKind: "no-prepare-path"` with an
|
|
100
|
-
`alternative`. Say the winner could not be prepared and name what you used instead.
|
|
101
|
-
|
|
102
|
-
## Rules
|
|
103
|
-
|
|
104
|
-
**One answer is not a comparison.** If only one source responded, say the route is
|
|
105
|
-
unbenchmarked. `sourcesAnswered` vs `sourcesTried` tells you.
|
|
106
|
-
|
|
107
|
-
**Never present an unknown cost as zero.** A route missing gas data is not free; it
|
|
108
|
-
is unmeasured. Those are different claims and only one of them is true.
|
|
109
|
-
|
|
110
|
-
**Duration is a cost on bridges.** A route saving $2 that takes 30 minutes is not
|
|
111
|
-
strictly better than one costing $2 more that lands in 20 seconds. Surface both and
|
|
112
|
-
let the user choose — do not silently pick for them.
|
|
113
|
-
|
|
114
|
-
**Quotes decay.** Every number here is from a past block. Re-quote immediately before
|
|
115
|
-
preparing, and never carry a minOut computed from a stale quote into a signature.
|
|
116
|
-
|
|
117
|
-
**A comparison is not an execution.** Ranking a route does not prepare, sign, or send
|
|
118
|
-
it. Preparing is a separate step, and signing belongs to the user.
|
|
119
|
-
|
|
120
|
-
## When sources fail
|
|
121
|
-
|
|
122
|
-
Aggregators go down, rate-limit, and get sunset (Odos sunset its public API in
|
|
123
|
-
July 2026). Individual failures are expected and appear in `failed[]`. Two things
|
|
124
|
-
follow:
|
|
125
|
-
|
|
126
|
-
1. Fewer sources means a weaker comparison. Report `sourcesAnswered`, do not hide it.
|
|
127
|
-
2. A failing source is **not** a bad price. Never rank it last — it did not answer.
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: oracle-bitcoin
|
|
3
|
-
description: Use for Bitcoin L1, Ordinals/runes research, and inscription PSBT preparation. User-wallet signing only.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Bitcoin L1 / Ordinals
|
|
7
|
-
|
|
8
|
-
Bitcoin is a separate signing plane. Do not route it through EVM grants, EVM
|
|
9
|
-
signers, or EVM calldata policy.
|
|
10
|
-
|
|
11
|
-
## What this skill owns
|
|
12
|
-
|
|
13
|
-
- Bitcoin L1 reads through Esplora: tip height, fee rates, address state, UTXOs,
|
|
14
|
-
transactions.
|
|
15
|
-
- Ordinals/runes reads through the Bitcoin metaprotocol data providers.
|
|
16
|
-
- Satflow marketplace research and unsigned PSBT intents for ordinals/runes market
|
|
17
|
-
actions when a Satflow key is configured.
|
|
18
|
-
- Inscription planning and **PSBT preparation** for user-wallet signing.
|
|
19
|
-
|
|
20
|
-
## Inscription flow
|
|
21
|
-
|
|
22
|
-
Default path is self-custodial:
|
|
23
|
-
|
|
24
|
-
1. Collect the inscription content, MIME type, destination address, change address,
|
|
25
|
-
and fee preference.
|
|
26
|
-
2. Check Bitcoin health, fee rates, and the inscription body-size cap.
|
|
27
|
-
3. Estimate commit/reveal cost and UTXO needs before preparing.
|
|
28
|
-
4. Prepare commit/reveal PSBTs or unsigned artifacts.
|
|
29
|
-
5. User signs in Xverse, UniSat, Leather, OKX, Phantom, Magic Eden wallet, or a
|
|
30
|
-
compatible injected Bitcoin wallet.
|
|
31
|
-
6. Broadcast only after explicit user confirmation.
|
|
32
|
-
7. Report commit txid, reveal txid, inscription id when known, and mempool/receipt
|
|
33
|
-
status.
|
|
34
|
-
|
|
35
|
-
## Hard rules
|
|
36
|
-
|
|
37
|
-
- Never request or print a seed, WIF, xprv, or wallet export.
|
|
38
|
-
- Operator WIF/local signing is not part of the public default. If a deployment
|
|
39
|
-
has it, it must be separately armed and still explicit-confirm gated.
|
|
40
|
-
- Inscribe is Bitcoin L1 commit/reveal. Satflow is marketplace inventory/listing,
|
|
41
|
-
not the inscription path.
|
|
42
|
-
- Fee facts are live facts. Re-read fees immediately before prepare.
|
|
43
|
-
- If content exceeds the current cap, refuse and offer compression/splitting.
|
|
44
|
-
- Never claim an inscription landed without a real reveal txid or inscription id.
|
|
45
|
-
|
|
46
|
-
## Review checklist
|
|
47
|
-
|
|
48
|
-
- Content hash and byte length shown before signing.
|
|
49
|
-
- MIME type shown in plain language.
|
|
50
|
-
- Destination and change addresses displayed and user-confirmed.
|
|
51
|
-
- Fee rate, estimated vbytes, and worst-case spend shown.
|
|
52
|
-
- Commit/reveal sequence explained as non-atomic.
|
|
53
|
-
- Mempool status checked after broadcast.
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: oracle-chain-graphs-telegram-cards
|
|
3
|
-
description: Render per-chain market graphs and Telegram cards for Oracle alerts, including meme launches, HL HIP-3/HIP-4, and Polymarket.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Oracle chain graphs + Telegram cards
|
|
7
|
-
|
|
8
|
-
Use when Oracle needs visual alerts: per-chain scanner cards, meme-token launch
|
|
9
|
-
cards, route-comparison charts, Hyperliquid HIP-3/HIP-4 cards, or Polymarket
|
|
10
|
-
cards.
|
|
11
|
-
|
|
12
|
-
## Surfaces
|
|
13
|
-
|
|
14
|
-
- Per-chain token charts: price, volume, liquidity, market cap, age, and venue.
|
|
15
|
-
- Launch/sniper cards: token, chain, pool, route readiness, sellability, smart-wallet
|
|
16
|
-
overlap, risk status, and prepared-ticket status.
|
|
17
|
-
- Hyperliquid HIP-3 builder-dex cards: dex, market, mark/oracle, funding, OI,
|
|
18
|
-
depth, liquidation/risk notes when account context is provided.
|
|
19
|
-
- Hyperliquid HIP-4 outcome-market cards: event/outcome, bid/ask, depth, edge,
|
|
20
|
-
held-position context when API keys/account reads are configured.
|
|
21
|
-
- Polymarket cards: event, market, Yes/No prices, volume, BBO, resolution-risk
|
|
22
|
-
notes, and prepared order intent only when user auth/API keys are configured.
|
|
23
|
-
|
|
24
|
-
## Data rules
|
|
25
|
-
|
|
26
|
-
- Public/keyless reads are allowed where the venue supports them.
|
|
27
|
-
- API-key surfaces activate only when the user self-hosts and provides their own
|
|
28
|
-
keys. Never ship DEMI keys or assume hosted secrets.
|
|
29
|
-
- A graph is evidence, not authorization. It can trigger a prepared ticket; it
|
|
30
|
-
must not bypass quote freshness, sell-sim, grant caps, or wallet signing.
|
|
31
|
-
- Every card states chain/venue and confidence. Unknown data stays `UNKNOWN`.
|
|
32
|
-
|
|
33
|
-
## Telegram card rules
|
|
34
|
-
|
|
35
|
-
- Send text card and graph as separate messages when the card is long.
|
|
36
|
-
- Avoid markdown traps: no unescaped underscore labels, avoid repeated `$` spans.
|
|
37
|
-
- Keep full contracts/mints visible; never truncate the only identifier.
|
|
38
|
-
- Chart rendering must soft-fail: card still sends if the image fails.
|
|
39
|
-
- No buy/sell buttons unless the recipient has a valid local grant/session.
|
|
40
|
-
|
|
41
|
-
## Graph schema
|
|
42
|
-
|
|
43
|
-
A graph payload should include:
|
|
44
|
-
|
|
45
|
-
- `chainId` / `cluster` / venue
|
|
46
|
-
- token/market id
|
|
47
|
-
- time window and candle interval
|
|
48
|
-
- price/volume/liquidity series or order-book snapshots
|
|
49
|
-
- source/provider and fetched timestamp
|
|
50
|
-
- warnings for stale, sparse, or degraded data
|
|
51
|
-
|
|
52
|
-
## HIP-3 / HIP-4 / Polymarket notes
|
|
53
|
-
|
|
54
|
-
- HIP-3 builder perps require Hyperliquid `perpDexs` and `metaAndAssetCtxs` with
|
|
55
|
-
`dex` selected; core `meta` does not include all builder-dex markets.
|
|
56
|
-
- HIP-4 outcome markets require the configured Hyperliquid/API-key path for user
|
|
57
|
-
account/order actions. Keyless cards can still show public market data.
|
|
58
|
-
- Polymarket public reads work keyless; trading/order placement needs the user's
|
|
59
|
-
CLOB auth/API setup and stays prepared/user-signed.
|