Address daily digest
You are composing a recurring summary of one or more Chia addresses — inflows, outflows, ending balance, USD/fiat values — and delivering it through whichever notification channel is installed. Designed to be scheduled once a day or once a week.
This skill follows the conventions in this repo's SKILLS.md. Read that if anything below is unclear.
Required capabilities
- chia-explorer (
mcp__chia-explorer__*) — mandatory. - A notification MCP — pick whichever is installed. Email is the natural fit for digests; if email isn't configured the skill will use a chat channel or fall back to a file at
~/.chia-skills/digests/<date>.md.
Resolve inputs
You need: $addresses, $period_hours, $currency, $channel.
$addresses— one address or a comma-separated list. Required.$period_hours— window to summarise. Default24(daily). Use168for weekly.$currency— three-letter code for fiat valuation. Defaultusd.$channel— notification channel, defaultauto.
Resolve: arguments → context → ask user. If $addresses missing after asking, emit STATUS: aborted, REASON: missing required inputs.
Validate each address (xch1... or txch1...). Drop invalid entries and warn the user inline; continue with the valid ones.
Load or initialise state
State file: ~/.chia-skills/state/address-daily-digest__<sha1_of_sorted_addresses>.json.
Shape:
{
"addresses": ["xch1...", "xch1..."],
"last_run_iso": "2026-05-18T08:00:00Z",
"last_run_height": 6532109,
"currency": "usd",
"skill_version": "0.1.0"
}
On first run: record current peak and now. Send a "digest watch started" confirmation with current balances, no historical events. Don't fabricate a back-dated report.
Define the window
Window end = current chain peak (and now for time).
Window start = last_run_height (and last_run_iso for time).
If period_hours is set and now - last_run_iso < period_hours - 5 minutes, this run is early — skip and emit STATUS: no_change, REASON: window not elapsed. (A 5-minute jitter tolerance for cron drift.)
Collect activity
For each address:
- Get all coin records created in the window (received).
- Get all coin records spent in the window (sent).
- Classify each (XCH / CAT / NFT / DID) via puzzle-classification tools.
- Compute ending balance via the balance tool.
For CATs and NFTs, label by asset_id / launcher_id. Unknown CATs: include the asset_id, mark "unknown CAT".
Apply fiat values
Fetch current XCH spot price in $currency once.
For receive-time valuations (more useful for tax / accounting than current valuation), the skill cannot retroactively look up historical XCH prices — chia-explorer's price tool is spot-only. Be explicit about this in the message body: "Fiat values reflect current spot price, not the price at receive time. For tax exports with historical prices, use the address-tax-export skill (roadmap)." Don't quietly mislabel.
Compose the digest
Email-friendly format. Markdown-light, ASCII tables.
Chia digest — 2026-05-19 → 2026-05-20 (24h)
Address: xch1yxq...8yl
INFLOWS (3)
+1.250 XCH block 6,532,210 ~$62.50
+500 USDS block 6,532,210 (CAT)
+1 NFT block 6,532,217 launcher 0xabc...
OUTFLOWS (1)
-0.050 XCH block 6,532,217 ~$2.50 fee 50,000 mojos
NET: +1.200 XCH (~$60.00)
BALANCE NOW: 12.347 XCH (~$617.35 at $50.00/XCH)
Fiat reflects current spot, not receive-time price.
For multi-address digests, repeat the per-address block and add a top-level summary:
Across 2 addresses, 24h period:
Inflows: 3.500 XCH + 500 USDS + 1 NFT
Outflows: 0.050 XCH
Net: +3.450 XCH (~$172.50)
Deliver
Pick channel by priority (email > slack > discord > push > webhook > inline file).
Subject line for email:
Chia digest — <date> (<N> addresses, <N> events)
If sending to a file (no channels available), write to ~/.chia-skills/digests/<iso8601-date>.md.
Update state
Set last_run_iso = now, last_run_height = current_peak. Atomic write.
Scheduling
Wire to:
scheduleskill / cron — daily at a fixed time (e.g. 08:00 local). Weekly at the same.- Manual — re-invoke for an ad-hoc summary, but you'll get whatever happened since the last automated run.
Hard rules
- Read-only. Never sign or push.
- Honest about pricing. Spot price ≠ receive-time price. Say so.
- Don't quietly skip invalid addresses. Tell the user which ones were dropped.
- First run is a "watch started" note, not a report.
Recovery patterns
- One address fails to query. Skip it, note the failure in the digest, continue with the rest. Emit
STATUS: partial. - All addresses fail. Emit
STATUS: failed,REASON: all chia-explorer calls failed. - Channel delivery fails. Save the rendered digest to
~/.chia-skills/digests/, emitSTATUS: partial.
Output
STATUS: success | no_change | partial | failed | aborted
ADDRESSES: <comma-separated list>
INFLOWS: <count>
OUTFLOWS: <count>
NET_XCH: <decimal, positive or negative>
BALANCE_XCH: <sum across addresses>
CURRENCY: <code>
CHANNEL: <channel used> | inline | none
ARTIFACT: <absolute path to saved digest file> | none
REASON: <one line, only when STATUS is failed, partial, aborted, or no_change>