From alchemy-skills
Generates shell scripts for automated crypto trading strategies (DCA, limit orders, stop losses) using mp CLI commands and cron/launchd scheduling.
npx claudepluginhub moonpay/skills --plugin alchemy-skillsThis skill uses the workspace's default tool permissions.
Compose `mp` CLI commands with OS scheduling (cron/launchd) to run unattended trading strategies: dollar-cost averaging, limit orders, and stop losses. The agent generates shell scripts and schedules them — no new tools needed.
Guides setup and management of automated trading strategies including limit orders, stop losses, DCA, TWAP, schedules for Bankr on EVM chains and Solana.
Creates and manages automated trading orders including limit buys/sells, stop losses, DCA schedules, TWAP execution via natural language prompts for EVM and Solana chains.
Executes buys, sells, swaps of meme coins/crypto on Solana, BSC, Base, Ethereum via GMGN CLI. Supports multi-wallet batches, limit orders, stop loss, take profit, trailing stops. Use for trade requests, order creation/status checks.
Share bugs, ideas, or general feedback.
Compose mp CLI commands with OS scheduling (cron/launchd) to run unattended trading strategies: dollar-cost averaging, limit orders, and stop losses. The agent generates shell scripts and schedules them — no new tools needed.
mp user retrievemp token balance list --wallet <name> --chain <chain>mp binary on PATH: which mp (note the full path for scheduled scripts)jq installed: which jqEvery strategy uses the same base pattern. Scripts live in ~/.config/moonpay/scripts/ and log to ~/.config/moonpay/logs/trading.log.
#!/bin/bash
set -euo pipefail
MP="$(which mp)" # absolute path for cron/launchd
LOG="$HOME/.config/moonpay/logs/trading.log"
mkdir -p "$(dirname "$LOG")"
log() { echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] $*" >> "$LOG"; }
# --- Config (agent fills these in) ---
WALLET="main"
CHAIN="solana"
FROM_TOKEN="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" # USDC
TO_TOKEN="So11111111111111111111111111111111111111111" # SOL
AMOUNT=5
# --- Execute ---
log "SWAP: $AMOUNT $FROM_TOKEN -> $TO_TOKEN on $CHAIN"
RESULT=$("$MP" --json token swap \
--wallet "$WALLET" --chain "$CHAIN" \
--from-token "$FROM_TOKEN" --from-amount "$AMOUNT" \
--to-token "$TO_TOKEN" 2>&1) || {
log "FAILED: $RESULT"
exit 1
}
log "OK: $RESULT"
Key points:
mp --json outputs single-line JSON, ideal for jq parsing$(which mp) and store as MP — cron/launchd have minimal PATHmp handles keychain decryption at runtimemp token search"Buy $5 of SOL every day at 9am"
~/.config/moonpay/scripts/dca-sol.shUse the base pattern above with the user's token, amount, wallet, and chain.
# Buy $5 of SOL daily at 9am UTC — moonpay:dca-sol
0 9 * * * ~/.config/moonpay/scripts/dca-sol.sh
Add with: (crontab -l 2>/dev/null; echo '0 9 * * * ~/.config/moonpay/scripts/dca-sol.sh # moonpay:dca-sol') | crontab -
Common intervals:
0 * * * *0 */4 * * *0 9 * * *0 9 * * 1Write a plist to ~/Library/LaunchAgents/com.moonpay.dca-sol.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.moonpay.dca-sol</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/USERNAME/.config/moonpay/scripts/dca-sol.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardErrorPath</key>
<string>/Users/USERNAME/.config/moonpay/logs/dca-sol.err</string>
</dict>
</plist>
Load with: launchctl load ~/Library/LaunchAgents/com.moonpay.dca-sol.plist
Important: Tilde (~) does NOT expand in plist files. Always use the full path (e.g., /Users/USERNAME/...). Get it with echo $HOME.
"Buy SOL when price drops below $80"
~/.config/moonpay/scripts/limit-buy-sol.sh#!/bin/bash
set -euo pipefail
MP="$(which mp)"
LOG="$HOME/.config/moonpay/logs/trading.log"
mkdir -p "$(dirname "$LOG")"
log() { echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] $*" >> "$LOG"; }
# --- Config ---
WALLET="main"
CHAIN="solana"
TOKEN="So11111111111111111111111111111111111111111"
BUY_WITH="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" # USDC
BUY_AMOUNT=50
TARGET_PRICE=80
SCRIPT_NAME="limit-buy-sol"
# --- Check price ---
PRICE=$("$MP" --json token search --query "$TOKEN" --chain "$CHAIN" | jq -r '.items[0].marketData.price')
if [ -z "$PRICE" ] || [ "$PRICE" = "null" ]; then
log "LIMIT $SCRIPT_NAME: price fetch failed, skipping"
exit 0
fi
# --- Compare ---
if (( $(echo "$PRICE < $TARGET_PRICE" | bc -l) )); then
log "LIMIT $SCRIPT_NAME: price $PRICE < $TARGET_PRICE — executing buy"
RESULT=$("$MP" --json token swap \
--wallet "$WALLET" --chain "$CHAIN" \
--from-token "$BUY_WITH" --from-amount "$BUY_AMOUNT" \
--to-token "$TOKEN" 2>&1) || {
log "LIMIT $SCRIPT_NAME FAILED: $RESULT"
exit 1
}
log "LIMIT $SCRIPT_NAME OK: bought at $PRICE — $RESULT"
# Self-disable after fill
if [[ "$OSTYPE" == "darwin"* ]]; then
launchctl unload "$HOME/Library/LaunchAgents/com.moonpay.${SCRIPT_NAME}.plist" 2>/dev/null || true
else
crontab -l | grep -v "$SCRIPT_NAME" | crontab -
fi
log "LIMIT $SCRIPT_NAME: disabled after fill"
else
log "LIMIT $SCRIPT_NAME: price $PRICE >= $TARGET_PRICE — waiting"
fi
Schedule every 5 minutes:
*/5 * * * * ~/.config/moonpay/scripts/limit-buy-sol.sh # moonpay:limit-buy-sol<key>StartInterval</key><integer>300</integer> instead of StartCalendarInterval"Sell all my SOL if price drops below $70"
Same structure as limit order but sells instead of buys. For "sell all", query the balance first:
# --- Config ---
SELL_TOKEN="So11111111111111111111111111111111111111111" # SOL
TO_TOKEN="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" # USDC
TRIGGER_PRICE=70
SCRIPT_NAME="stop-loss-sol"
# --- Check price ---
PRICE=$("$MP" --json token search --query "$SELL_TOKEN" --chain "$CHAIN" | jq -r '.items[0].marketData.price')
if (( $(echo "$PRICE < $TRIGGER_PRICE" | bc -l) )); then
# Get current balance to sell all
BALANCE=$("$MP" --json token balance list --wallet "$WALLET" --chain "$CHAIN" \
| jq -r --arg addr "$SELL_TOKEN" '.items[] | select(.address == $addr) | .balance.amount')
if [ -n "$BALANCE" ] && (( $(echo "$BALANCE > 0" | bc -l) )); then
log "STOP-LOSS $SCRIPT_NAME: price $PRICE < $TRIGGER_PRICE — selling $BALANCE"
RESULT=$("$MP" --json token swap \
--wallet "$WALLET" --chain "$CHAIN" \
--from-token "$SELL_TOKEN" --from-amount "$BALANCE" \
--to-token "$TO_TOKEN" 2>&1) || {
log "STOP-LOSS $SCRIPT_NAME FAILED: $RESULT"
exit 1
}
log "STOP-LOSS $SCRIPT_NAME OK: sold at $PRICE — $RESULT"
# Self-disable (same pattern as limit order)
fi
fi
# macOS
launchctl list | grep moonpay
# Linux
crontab -l | grep moonpay
# macOS
launchctl unload ~/Library/LaunchAgents/com.moonpay.dca-sol.plist
rm ~/Library/LaunchAgents/com.moonpay.dca-sol.plist
# Linux
crontab -l | grep -v "moonpay:dca-sol" | crontab -
tail -50 ~/.config/moonpay/logs/trading.log
launchctl unload ~/Library/LaunchAgents/com.moonpay.dca-sol.plist # pause
launchctl load ~/Library/LaunchAgents/com.moonpay.dca-sol.plist # resume
Detect the OS and use the appropriate scheduler:
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS: use launchd (fires even if machine was asleep)
else
# Linux: use crontab
fi
tail -20 ~/.config/moonpay/logs/trading.logmp decrypts wallets via OS keychain at runtimemp token search are free; swaps cost gasbc -l for decimal price comparison (bash can't compare floats natively)bc isn't available, use: awk "BEGIN {exit !($PRICE < $TARGET)}"# moonpay:{name} so they can be found and removed