Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
- 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>
130 lines
5.0 KiB
Bash
Executable File
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
|