Files
proxmox/scripts/gru-m1/dominance-simulation.sh
defiQUG fbda1b4beb
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
docs: Ledger Live integration, contract deploy learnings, NEXT_STEPS updates
- ADD_CHAIN138_TO_LEDGER_LIVE: Ledger form done; public code review repo bis-innovations/LedgerLive; init/push commands
- CONTRACT_DEPLOYMENT_RUNBOOK: Chain 138 gas price 1 gwei, 36-addr check, TransactionMirror workaround
- CONTRACT_*: AddressMapper, MirrorManager deployed 2026-02-12; 36-address on-chain check
- NEXT_STEPS_FOR_YOU: Ledger done; steps completable now (no LAN); run-completable-tasks-from-anywhere
- MASTER_INDEX, OPERATOR_OPTIONAL, SMART_CONTRACTS_INVENTORY_SIMPLE: updates
- LEDGER_BLOCKCHAIN_INTEGRATION_COMPLETE: bis-innovations/LedgerLive reference

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 15:46:57 -08:00

130 lines
5.0 KiB
Bash
Executable File

#!/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