You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is the **template** for the NFT Collector Copilot agent on Pinata. The OpenSea skill it depends on lives in [`ProjectOpenSea/opensea-skill`](https://github.com/ProjectOpenSea/opensea-skill) and is published to ClawHub as `opensea/opensea-marketplace`. Skill changes do **not** belong here — open them against that repo. Template changes (workspace docs, manifest, README) belong here.
4
+
5
+
## Repo layout
6
+
7
+
See `README.md` → *Repository layout*. The short version: `manifest.json` defines the agent, `.openclaw/` configures the harness, `workspace/` holds everything the agent reads at runtime.
8
+
9
+
## Making changes
10
+
11
+
1. Branch from `main`: `git checkout -b your-change`.
12
+
2. Edit. Most edits are to `workspace/*.md` or `manifest.json`.
13
+
3. Run validation locally before pushing — same checks CI runs:
14
+
```bash
15
+
jq . manifest.json > /dev/null
16
+
jq . .openclaw/openclaw.json > /dev/null
17
+
```
18
+
4. Open a PR. CI runs the same shape checks plus presence checks for required workspace files.
-`template.version` (semver string) — this template's version. Bump on every change that ships to users:
26
+
- patch: doc tweaks, prompt fixes
27
+
- minor: new heartbeat steps, new memory schemas, new TOOLS.md fields
28
+
- major: breaking changes to memory layout, manifest shape, or env requirements
29
+
30
+
Tag releases on `main` after merge: `git tag v1.0.1 && git push --tags`.
31
+
32
+
## Style
33
+
34
+
Match the existing voice: terse, numerate, defers to the skill rather than duplicating it. The agent reads these files every session — every line costs context. Cut anything that isn't load-bearing.
35
+
36
+
## Don't commit
37
+
38
+
- Secrets, `.env*`, real API keys, real wallet IDs.
Copy file name to clipboardExpand all lines: README.md
+7-5Lines changed: 7 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ An AI agent for NFT collectors. Watches [OpenSea](https://opensea.io), scores ev
4
4
5
5
## The killer feature: **Whale-Cross Alerts**
6
6
7
-
Point it at a list of wallets you respect (vitalik.eth, your favorite PFP whale, whoever) and your watchlist. When a tracked whale buys, mints, or lists into any collection — whether it's on your watchlist or not — you get a one-line alert within a heartbeat, with a one-click follow gated by your Privy spend cap. Nobody else ships this because nobody else has the OpenSea Stream API, a TEE-enforced wallet, and a scoring rubric in one box.
7
+
Point it at a list of wallets you respect (vitalik.eth, your favorite PFP whale, whoever) and your watchlist. When a tracked whale buys, mints, or lists into any collection — whether it's on your watchlist or not — you get a one-line alert within a heartbeat, with a one-click follow gated by your Privy spend cap. Few others ship this — it takes the OpenSea events feed, a TEE-enforced wallet, and a disciplined scoring rubric in the same box.
8
8
9
9
## What it does
10
10
@@ -66,7 +66,7 @@ Full walkthrough: `skills/opensea/references/wallet-setup.md`. Policy templates:
66
66
-**Env-only credentials.** No private keys in the repo or agent workspace.
67
67
-**Privy policy is the hard ceiling.** The spend cap, destination allowlist, and chain filter are enforced inside a TEE before signing.
68
68
-**Per-turn confirmation for material actions.** Any buy, offer acceptance, approval, or transfer above `confirmAboveEth` (in `workspace/TOOLS.md`) needs explicit "yes" in the current turn. Snipes can bypass this only when the listing is fully inside your configured envelope — see `workspace/SOUL.md` → *Hierarchy of Ceilings*.
69
-
-**Sell-side always confirms.**The native-value Privy cap doesn't constrain WETH offer acceptances, so those always require per-turn approval regardless of price.
69
+
-**Sell-side always confirms.**Privy's native-value cap is denominated in the chain's native token (ETH, etc.) — it does **not** apply to WETH transfers, which is how Seaport offer acceptances pay out. Sells, offer acceptances, and ERC721/1155 approvals therefore always require per-turn confirmation, regardless of price.
70
70
-**Pre-Buy Gate.** Wash trades, thin markets, uneconomic gas, and fee surprises all block a buy before it's proposed.
71
71
-**Policy rejections surface verbatim.** No workarounds.
72
72
@@ -75,17 +75,19 @@ Full walkthrough: `skills/opensea/references/wallet-setup.md`. Policy templates:
Tracks the last run of HEARTBEAT.md steps 5 (drops) and 6 (trending), which run at most every ~20 hours.
61
+
62
+
```json
63
+
{
64
+
"last_drop_scan": "2026-04-17T02:00:00Z",
65
+
"last_trending_scan": "2026-04-17T02:00:00Z"
66
+
}
67
+
```
68
+
58
69
### `MEMORY.md` (in `workspace/`, not `memory/`)
59
70
60
71
Free-text long-form observations that don't fit a schema: API quirks, volatile slugs, seller wallets that pattern wash-trade, drops that disappointed, specific things the user said about their taste that you want to remember word-for-word.
- Filter the tail since last heartbeat (track `memory/whale_cursor.json` per address).
50
50
- Events of interest: `sale` (whale bought), `item_received` (new NFT), `listing` (whale listing for sale).
51
51
- If the whale touched a collection in the watchlist, queue a high-priority alert. If they touched a collection *not* in the watchlist, queue a soft alert — this is the signal for the user to consider adding it.
52
52
53
53
### 5. Drop radar — once per day, not every heartbeat
54
54
55
-
Check `memory/last_drop_scan` timestamp. If > 20 hours since last scan:
55
+
Check `memory/scan_state.json` → `last_drop_scan`. If > 20 hours since last scan:
56
56
57
57
-`opensea --format toon drops list --type upcoming --limit 10`
58
58
-`opensea --format toon drops list --type featured --limit 10`
59
-
- Cross-reference against `memory/taste.json` — if a drop matches a theme the user has bought or bookmarked, queue an alert with the drop page, stage info, and mint mechanic. Save`last_drop_scan`.
59
+
- Cross-reference against `memory/taste.json` — if a drop matches a theme the user has bought or bookmarked, queue an alert with the drop page, stage info, and mint mechanic. Update `memory/scan_state.json` →`last_drop_scan`.
60
60
61
61
### 6. Trending scan — once per day
62
62
63
-
Check `memory/last_trending_scan`. If > 20 hours since last scan:
63
+
Check `memory/scan_state.json` → `last_trending_scan`. If > 20 hours since last scan:
- For each trending slug not already watched, cross-reference against `taste.json`. Propose adding up to three with a one-line rationale; the user decides.
66
+
- For each trending slug not already watched, cross-reference against `taste.json`. Propose adding up to three with a one-line rationale; the user decides. Update `memory/scan_state.json` → `last_trending_scan`.
0 commit comments