From 13b13ff521fb1bbe0a8963be8dae9f1dfbbc63e6 Mon Sep 17 00:00:00 2001 From: blackbird987 Date: Thu, 23 Jul 2026 21:32:15 +0200 Subject: [PATCH 1/3] Showcase: add DegenAI (ACP HyperLiquid trade execution) --- showcase/degenai/showcase.json | 56 +++++++++++++ .../acp-hyperliquid-trade-execution/SKILL.md | 84 +++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 showcase/degenai/showcase.json create mode 100644 showcase/degenai/skills/acp-hyperliquid-trade-execution/SKILL.md diff --git a/showcase/degenai/showcase.json b/showcase/degenai/showcase.json new file mode 100644 index 0000000..e96ee92 --- /dev/null +++ b/showcase/degenai/showcase.json @@ -0,0 +1,56 @@ +{ + "slug": "degenai", + "title": "DegenAI", + "tagline": "Executes live HyperLiquid perp trades from a natural-language ACP job and returns on-chain fill proof", + "description": "Accepts a natural-language trading job over Virtuals ACP, validates the caller's HyperLiquid agent authorization and margin, and executes the order (limit, market, stop, or batch with take-profit/stop-loss) through the same engine that powers the DegenAI terminal. Returns a deliverable with on-chain fill hashes, average fill price, fees, realized PnL, and post-trade account leverage as proof.", + "status": "live integration", + "topic": "commerce", + "topics": ["trading", "defi", "acp"], + "builder": { + "name": "DegenAI", + "url": "https://degenai.dev" + }, + "links": { + "repo": "https://github.com/Virtual-Protocol/acp-cli-demos/tree/main/showcase/degenai", + "demo": "https://degenai.dev", + "share": "https://x.com/DegenAI_0x/status/2000544000667685004", + "feedback": "https://github.com/Virtual-Protocol/acp-cli-demos/issues/new?title=Feedback%3A%20DegenAI" + }, + "primitives": ["acp", "wallet"], + "visual": { + "kind": "capability card", + "eyebrow": "acp + hyperliquid", + "title": "live trade execution" + }, + "skills": [ + { + "name": "acp-hyperliquid-trade-execution", + "href": "https://github.com/Virtual-Protocol/acp-cli-demos/tree/main/showcase/degenai/skills/acp-hyperliquid-trade-execution", + "sourcePath": "showcase/degenai/skills/acp-hyperliquid-trade-execution", + "summary": "Submit a trading job to DegenAI over Virtuals ACP and receive an executed HyperLiquid order with on-chain fill proof. Covers asset discovery, order placement (limit/market/stop/batch), take-profit and stop-loss, and reading back fills, PnL, and account leverage.", + "install": "cp -R showcase/degenai/skills/acp-hyperliquid-trade-execution ~/.agents/skills/\ncp -R showcase/degenai/skills/acp-hyperliquid-trade-execution ~/.claude/skills/" + } + ], + "artifacts": [ + { + "label": "Live product", + "href": "https://degenai.dev", + "kind": "proof" + }, + { + "label": "ACP trade-execution skill source", + "href": "https://github.com/Virtual-Protocol/acp-cli-demos/tree/main/showcase/degenai/skills/acp-hyperliquid-trade-execution", + "kind": "skill" + }, + { + "label": "ACP launch announcement", + "href": "https://x.com/DegenAI_0x/status/2000544000667685004", + "kind": "proof" + } + ], + "feedbackPrompts": [ + "Which venues beyond HyperLiquid should this execute on next?", + "What deliverable fields matter most for your agent's downstream logic?", + "Would preset risk controls (stop-loss / take-profit) make this safer to call?" + ] +} diff --git a/showcase/degenai/skills/acp-hyperliquid-trade-execution/SKILL.md b/showcase/degenai/skills/acp-hyperliquid-trade-execution/SKILL.md new file mode 100644 index 0000000..6e83f1c --- /dev/null +++ b/showcase/degenai/skills/acp-hyperliquid-trade-execution/SKILL.md @@ -0,0 +1,84 @@ +# ACP HyperLiquid Trade Execution (DegenAI) + +Submit a trading job to **DegenAI** over Virtuals ACP and get back an executed +HyperLiquid perpetual order with on-chain fill proof. + +## When to use + +- You want an agent to place, modify, or cancel real HyperLiquid perp orders + through a natural-language ACP job. +- You need on-chain proof (fill hashes) and post-trade account context back as + a deliverable. + +## When NOT to use + +- You only want analysis, signals, or charts. This skill executes trades; it + does not return standalone research. +- The trading wallet has not approved a DegenAI agent link, or holds less than + $10 USDC free margin. Resolve authorization/margin first. +- You are not authorized to spend real funds. Every accepted job moves real + money on a live exchange. + +## Inputs + +- `intent` - natural-language or structured order: side (buy/sell), USD size, + optional limit price, take-profit, stop-loss; or a modify / cancel request. +- `wallet` - the HyperLiquid wallet whose approved DegenAI agent will sign. + +## Tools exposed by DegenAI over ACP + +- `get_available_assets` - list every tradable HyperLiquid asset with metadata. +- `hyperliquid_order` - `create_limit` / `create_market` / `create_stop` / + `create_batch` / `modify_by_oid` / `modify_by_cloid` / `modify_batch` / + `cancel_by_oid` / `cancel_by_cloid` / `cancel_batch`. Supports take-profit, + stop-loss, reduce-only, time-in-force (Gtc / Ioc / Alo), and client order + IDs (CLOID). + +## Credentials and preconditions + +- The wallet must have approved a DegenAI agent link (one Butler agent per + wallet; relink via the trading-status resource if a different agent is + attached). +- Free margin >= $10 USDC per order (HyperLiquid minimum notional). +- Query the trading-status resource first to confirm authorization, check + margin, and retrieve the setup / top-up link. + +## Approval gates (spending / production mutations) + +- Placing, modifying, or cancelling an order moves real funds and mutates a + live exchange account. The submitting agent MUST have explicit human or + policy approval for the notional being traded before opening the job. +- Confirm side, asset, USD size, and any stop-loss / take-profit against the + approved intent before execution. + +## Stop conditions and handoff + +- Stop if trading is not authorized, margin is insufficient, or the asset is + not tradable - return the setup / top-up link and hand back to the caller. +- Stop if any single order is below $10 notional (it will be rejected). +- On partial batch failure, surface which orders placed vs failed; do not + silently retry. + +## Validation and output contract + +The job deliverable returns: + +- `success` (bool) and `action` (place / modify / cancel) +- `orderIds` - placed / affected order IDs +- `fillHashes` - on-chain transaction hashes per filled order (proof) +- `fillDetails` - average price, total fees, realized PnL, total size, fill count +- `accountContext` - account value, margin used, leverage ratio after the trade +- On failure: `errorCode` and `errorMessage`, no partial silent state + +## Example job + +> "Buy $50 of BTC at market, set a stop-loss at 58000 and a take-profit at 72000." + +DegenAI validates authorization and margin, executes the market order with the +bracket, and returns the order IDs, on-chain fill hash, average fill price and +fees, and the updated account leverage. + +## Notes + +- Batch operations execute atomically (all succeed or all fail) in one call. +- The Butler fee is kept to a $0.01 minimum per request. From c9dfb568f11b1318d3489b3f4936d9da7bfd6811 Mon Sep 17 00:00:00 2001 From: blackbird987 Date: Thu, 23 Jul 2026 22:13:40 +0200 Subject: [PATCH 2/3] showcase/degenai: add 16:9 branded card poster --- showcase/degenai/assets/poster.jpg | Bin 0 -> 36491 bytes showcase/degenai/showcase.json | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 showcase/degenai/assets/poster.jpg diff --git a/showcase/degenai/assets/poster.jpg b/showcase/degenai/assets/poster.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46282a209220d8d61465a2c5ea7f0bce9308a1f4 GIT binary patch literal 36491 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 literal 0 HcmV?d00001 diff --git a/showcase/degenai/showcase.json b/showcase/degenai/showcase.json index e96ee92..2547fba 100644 --- a/showcase/degenai/showcase.json +++ b/showcase/degenai/showcase.json @@ -20,7 +20,8 @@ "visual": { "kind": "capability card", "eyebrow": "acp + hyperliquid", - "title": "live trade execution" + "title": "live trade execution", + "posterUrl": "https://raw.githubusercontent.com/Virtual-Protocol/acp-cli-demos/main/showcase/degenai/assets/poster.jpg" }, "skills": [ { From 2817e60647207505371c66d2c91066690dffa9b1 Mon Sep 17 00:00:00 2001 From: blackbird987 Date: Fri, 24 Jul 2026 03:31:59 +0200 Subject: [PATCH 3/3] showcase/degenai: add ACP automation skill; widen card to cover automated strategies --- showcase/degenai/showcase.json | 18 +++- .../degenai/skills/acp-automation/SKILL.md | 91 +++++++++++++++++++ 2 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 showcase/degenai/skills/acp-automation/SKILL.md diff --git a/showcase/degenai/showcase.json b/showcase/degenai/showcase.json index 2547fba..c48c664 100644 --- a/showcase/degenai/showcase.json +++ b/showcase/degenai/showcase.json @@ -1,8 +1,8 @@ { "slug": "degenai", "title": "DegenAI", - "tagline": "Executes live HyperLiquid perp trades from a natural-language ACP job and returns on-chain fill proof", - "description": "Accepts a natural-language trading job over Virtuals ACP, validates the caller's HyperLiquid agent authorization and margin, and executes the order (limit, market, stop, or batch with take-profit/stop-loss) through the same engine that powers the DegenAI terminal. Returns a deliverable with on-chain fill hashes, average fill price, fees, realized PnL, and post-trade account leverage as proof.", + "tagline": "Creates and runs custom trigger-based HyperLiquid strategies from natural-language ACP jobs, and returns on-chain fill proof", + "description": "Accepts natural-language jobs over Virtuals ACP and runs them on HyperLiquid through the same engine that powers the DegenAI terminal. Agents can execute one-shot orders (limit, market, stop, or atomic batch with take-profit and stop-loss), or create custom trigger-based automation rules -- persistent strategies that evaluate natural-language conditions on a loop and place trades when they fire -- then list, inspect, evaluate, top up, and start or stop them, all over ACP. Every trade returns on-chain fill hashes, average fill price, fees, realized PnL, and post-trade account leverage as proof.", "status": "live integration", "topic": "commerce", "topics": ["trading", "defi", "acp"], @@ -20,7 +20,7 @@ "visual": { "kind": "capability card", "eyebrow": "acp + hyperliquid", - "title": "live trade execution", + "title": "automated strategies + live execution", "posterUrl": "https://raw.githubusercontent.com/Virtual-Protocol/acp-cli-demos/main/showcase/degenai/assets/poster.jpg" }, "skills": [ @@ -30,6 +30,13 @@ "sourcePath": "showcase/degenai/skills/acp-hyperliquid-trade-execution", "summary": "Submit a trading job to DegenAI over Virtuals ACP and receive an executed HyperLiquid order with on-chain fill proof. Covers asset discovery, order placement (limit/market/stop/batch), take-profit and stop-loss, and reading back fills, PnL, and account leverage.", "install": "cp -R showcase/degenai/skills/acp-hyperliquid-trade-execution ~/.agents/skills/\ncp -R showcase/degenai/skills/acp-hyperliquid-trade-execution ~/.claude/skills/" + }, + { + "name": "acp-automation", + "href": "https://github.com/Virtual-Protocol/acp-cli-demos/tree/main/showcase/degenai/skills/acp-automation", + "sourcePath": "showcase/degenai/skills/acp-automation", + "summary": "Create and run custom trigger-based trading automations on DegenAI over Virtuals ACP. Define a strategy in natural language and DegenAI evaluates the conditions on a loop, placing HyperLiquid orders when they fire. Covers create, list, inspect, single-shot evaluate, top-up, and start/stop/delete of rules.", + "install": "cp -R showcase/degenai/skills/acp-automation ~/.agents/skills/\ncp -R showcase/degenai/skills/acp-automation ~/.claude/skills/" } ], "artifacts": [ @@ -43,6 +50,11 @@ "href": "https://github.com/Virtual-Protocol/acp-cli-demos/tree/main/showcase/degenai/skills/acp-hyperliquid-trade-execution", "kind": "skill" }, + { + "label": "ACP automation skill source", + "href": "https://github.com/Virtual-Protocol/acp-cli-demos/tree/main/showcase/degenai/skills/acp-automation", + "kind": "skill" + }, { "label": "ACP launch announcement", "href": "https://x.com/DegenAI_0x/status/2000544000667685004", diff --git a/showcase/degenai/skills/acp-automation/SKILL.md b/showcase/degenai/skills/acp-automation/SKILL.md new file mode 100644 index 0000000..53c1d2d --- /dev/null +++ b/showcase/degenai/skills/acp-automation/SKILL.md @@ -0,0 +1,91 @@ +# ACP Automation (DegenAI) + +Create and run **custom trigger-based trading automations** on **DegenAI** over +Virtuals ACP. Define a strategy in natural language; DegenAI evaluates the +conditions on a loop and places HyperLiquid orders when they fire. + +## When to use + +- You want a persistent, condition-driven strategy (not a one-shot order): + "buy the dip if BTC 4h RSI drops below 30", "trail a stop as price rises", + "close half the position when it's up 20%". +- You need to create, inspect, top up, or stop automations owned by a wallet, + over ACP. + +## When NOT to use + +- You just want a single immediate order. Use the trade-execution skill instead. +- The trading wallet has not approved a DegenAI agent link or holds less than + $10 USDC free margin. Resolve authorization/margin first. +- You are not authorized to spend real funds. A live automation places real + orders on a live exchange whenever its condition fires. + +## Capabilities exposed by DegenAI over ACP + +- `automation_info` - system metadata: supported assets, valid intervals, + trigger types, resource limits, and pricing. Call this before creating so you + build a valid rule. +- `automation_create` - create a rule from natural-language conditions and + actions. Requires trading authorization. Bundles 1000 LLM evaluation checks. +- `automation_list` - list every rule for the wallet with its state, asset, + condition, and the shared evaluation-check balance. +- `automation_status` - a single rule's live state: last check result, trigger + configuration, and recent execution logs. +- `automation_evaluate` - run one evaluation on demand; charged only for the + actual LLM usage it consumes. +- `automation_manage` - start, stop, or delete a rule. Stop pauses evaluation + without deleting; delete removes it. +- `automation_topup` - add 1000 evaluation checks to the wallet's shared + balance. + +## Billing model + +- Evaluation "checks" are a per-wallet balance shared across all of that + wallet's automations. `automation_create` bundles 1000; `automation_topup` + adds 1000 more; `automation_evaluate` charges for actual usage. +- The rule's trades themselves settle on HyperLiquid under the wallet's + approved DegenAI agent - the same authorization used for one-shot execution. + +## Credentials and preconditions + +- The wallet must have approved a DegenAI agent link (one Butler agent per + wallet). +- Free margin >= $10 USDC per order the automation will place (HyperLiquid + minimum notional). +- Call `automation_info` first to confirm supported assets, intervals, and + trigger types before creating. + +## Approval gates (spending / production mutations) + +- A live automation places real orders whenever its condition fires, without a + human in the loop at fire time. The submitting agent MUST have explicit human + or policy approval for the strategy and its notional before creating the rule. +- Per-wallet and per-asset automation caps are enforced before payment settles; + a rule that would exceed a cap is rejected rather than created. + +## Stop conditions and handoff + +- Stop if trading is not authorized, margin is insufficient, or the asset / + interval / trigger type is unsupported (checked via `automation_info`) - hand + the setup / top-up link back to the caller. +- To halt a running strategy, call `automation_manage` with stop (pause) or + delete. Stopping is reversible; deleting is not. + +## Validation and output contract + +- `automation_create` returns the rule id, state (active / armed / paused), the + resolved trigger and next check time, and the remaining evaluation-check + balance. +- `automation_evaluate` returns condition met / not met, the reasoning, and any + action taken (including on-chain fill details when it places a trade). +- On failure: `errorCode` and `errorMessage`, no silent partial state. + +## Example job + +> "Create an automation on ETH 1h: if RSI closes below 30, buy $50 at market +> with a stop-loss 3% below entry. Check every closed 1h candle." + +DegenAI validates authorization and margin, creates the rule with a candle-close +trigger, and returns the rule id, its armed trigger, the next check time, and +the evaluation-check balance. When the condition later fires, it places the +order and records on-chain fill proof.