#!/usr/bin/env bash # # GRU M1 Dominance Simulation (S0-S5) # Simulates how GRU M1 supply affects BTC/ETH/Stablecoin dominance. # Uses CoinGecko global API; falls back to env vars if API fails. # # Usage: ./dominance-simulation.sh [output_file] # output_file: optional path to write markdown report # # Env fallback (if API unavailable): # GRU_M1_TOTAL_MARKET_CAP - total crypto market cap (USD) # GRU_M1_BTC_DOMINANCE - BTC dominance % # GRU_M1_ETH_DOMINANCE - ETH dominance % # GRU_M1_STABLECOIN_DOM - stablecoin dominance % # set -e COINGECKO_URL="${COINGECKO_URL:-https://api.coingecko.com/api/v3/global}" SCENARIOS=(0 100000000 500000000 1000000000 5000000000 10000000000) SCENARIO_LABELS=("S0" "S1" "S2" "S3" "S4" "S5") SCENARIO_DESCS=("Baseline (no GRU M1)" "Pilot (\$100M)" "Early institutional (\$500M)" "Regional (\$1B)" "Multi-jurisdiction (\$5B)" "Systemic (\$10B)") # Fetch baseline from CoinGecko fetch_baseline() { if command -v curl >/dev/null 2>&1 && command -v jq >/dev/null 2>&1; then local json json=$(curl -sL --connect-timeout 10 "$COINGECKO_URL" 2>/dev/null) || return 1 local total_usd total_usd=$(echo "$json" | jq -r '.data.total_market_cap.usd // empty') [[ -z "$total_usd" || "$total_usd" == "null" ]] && return 1 local btc_pct eth_pct usdt_pct usdc_pct btc_pct=$(echo "$json" | jq -r '.data.market_cap_percentage.btc // 0') eth_pct=$(echo "$json" | jq -r '.data.market_cap_percentage.eth // 0') usdt_pct=$(echo "$json" | jq -r '.data.market_cap_percentage.usdt // 0') usdc_pct=$(echo "$json" | jq -r '.data.market_cap_percentage.usdc // 0') local stable_pct stable_pct=$(echo "$usdt_pct + $usdc_pct" | bc 2>/dev/null || echo "$usdt_pct $usdc_pct" | awk '{print $1+$2}') echo "${total_usd} ${btc_pct} ${eth_pct} ${stable_pct}" return 0 fi return 1 } # Use env fallback env_baseline() { local total="${GRU_M1_TOTAL_MARKET_CAP:-2500000000000}" local btc="${GRU_M1_BTC_DOMINANCE:-54}" local eth="${GRU_M1_ETH_DOMINANCE:-18}" local stable="${GRU_M1_STABLECOIN_DOM:-10}" echo "${total} ${btc} ${eth} ${stable}" } # Format number for display (e.g. 2.5T, 100M) fmt_num() { local n="$1" awk -v n="$n" 'BEGIN { if (n >= 1e12) printf "%.2fT", n/1e12 else if (n >= 1e9) printf "%.2fB", n/1e9 else if (n >= 1e6) printf "%.2fM", n/1e6 else printf "%s", n }' } # Run simulation and output markdown run_simulation() { local baseline baseline=$(fetch_baseline 2>/dev/null) || baseline=$(env_baseline) read -r total_usd btc_pct eth_pct stable_pct <<< "$baseline" # Derive caps from percentages (stablecoin cap = total * stable_pct/100) local btc_cap eth_cap stable_cap btc_cap=$(echo "scale=2; $total_usd * $btc_pct / 100" | bc 2>/dev/null || echo "$total_usd $btc_pct" | awk '{printf "%.2f", $1*$2/100}') eth_cap=$(echo "scale=2; $total_usd * $eth_pct / 100" | bc 2>/dev/null || echo "$total_usd $eth_pct" | awk '{printf "%.2f", $1*$2/100}') stable_cap=$(echo "scale=2; $total_usd * $stable_pct / 100" | bc 2>/dev/null || echo "$total_usd $stable_pct" | awk '{printf "%.2f", $1*$2/100}') local timestamp timestamp=$(date -u +"%Y-%m-%d %H:%M UTC" 2>/dev/null || date -u) echo "# GRU M1 Dominance Simulation Results" echo "" echo "**Generated:** $timestamp" echo "" echo "## Baseline (Reference Snapshot)" echo "" echo "| Variable | Value |" echo "| -------- | ----- |" echo "| Total Market Cap | \$$(fmt_num "$total_usd") |" echo "| BTC Dominance | ${btc_pct}% |" echo "| ETH Dominance | ${eth_pct}% |" echo "| Stablecoin Dominance | ${stable_pct}% |" echo "" echo "## Simulation Scenarios (S0-S5)" echo "" echo "| Scenario | Total Cap | Stablecoin Cap | BTC Dom % | ETH Dom % | Stablecoin Dom % |" echo "| -------- | --------- | -------------- | --------- | --------- | ---------------- |" for i in "${!SCENARIOS[@]}"; do local gru_m1="${SCENARIOS[$i]}" local new_total new_stable new_total=$(awk "BEGIN {printf \"%.2f\", $total_usd + $gru_m1}") new_stable=$(awk "BEGIN {printf \"%.2f\", $stable_cap + $gru_m1}") local btc_dom eth_dom stable_dom btc_dom=$(awk "BEGIN {printf \"%.2f\", $btc_cap / $new_total * 100}") eth_dom=$(awk "BEGIN {printf \"%.2f\", $eth_cap / $new_total * 100}") stable_dom=$(awk "BEGIN {printf \"%.2f\", $new_stable / $new_total * 100}") echo "| ${SCENARIO_LABELS[$i]} | \$$(fmt_num "$new_total") | \$$(fmt_num "$new_stable") | $btc_dom | $eth_dom | $stable_dom |" done echo "" echo "## Interpretation" echo "" echo "- BTC/ETH dominance declines mechanically as GRU M1 supply grows" echo "- Stablecoin dominance increases without volatility" echo "- No implication of speculative capital shift" echo "- Use **ex-M1 internal metrics** for risk analysis" echo "" echo "---" echo "See: [GRU M1 Real-Data Dominance Addendum](../../docs/gru-m1/GRU_M1_REAL_DATA_DOMINANCE_ADDENDUM.md)" } # Main output_file="${1:-}" if [[ -n "$output_file" ]]; then mkdir -p "$(dirname "$output_file")" run_simulation > "$output_file" echo "Report written to: $output_file" else run_simulation fi