"""Recompute declared scenarios, not forecasts or measured operating results.""" import json,csv,hashlib,sys from pathlib import Path from decimal import Decimal, ROUND_CEILING D=lambda x:Decimal(str(x)) def analyze(folder): raw=(folder/'inputs.json').read_bytes() expected=json.loads((folder/'input-sha256.json').read_text())['inputs.json'] assert hashlib.sha256(raw).hexdigest()==expected,'Input checksum mismatch' p=json.loads(raw); attack=[] for m in p['hardware']: for h in p['honest_hashrate_phs']: for q in p['target_new_share']: required=D(h)*D(q)/(1-D(q)) units=int((required*D(1000000)/D(m['ghs'])).to_integral_value(rounding=ROUND_CEILING)) power=D(units)*D(m['watts'])/1000000 attack.append({'model':m['id'],'honest_phs':h,'target_share':q,'additional_phs':str(required),'units':units,'gross_list_price_usd':str(D(units)*D(m['price_usd'])),'power_mw':str(power),'energy_usd_hour_at_010':str(power*1000*D('.10'))}) a=p['payment_report_2025']; total=D(a['total_orders']); off=D(a['offchain_orders']); share=D(a['ltc_share_percent'])/100 adoption={'all_orders':int(total),'offchain_orders':int(off),'eligible_if_exclusion_applies':int(total-off),'naive_total_times_share':str(total*share),'excluded_base_times_share':str((total-off)*share),'denominator_gap_estimated_orders':str(off*share),'half_005pp_uncertainty_on_excluded_base':str((total-off)*D('.0005'))} cards=[] for spread in p['sale_spread_percent']: for fee in p['fixed_sale_fee_eur']: budget=D(p['card_budget_eur']);net=budget*(1-D(spread)/100)-D(fee) cards.append({'budget_eur':str(budget),'spread_percent':spread,'fixed_fee_eur':fee,'net_eur':str(net),'effective_cost_percent':str((1-net/budget)*100)}) treasury=[] s=p['synthetic_treasury'] for price in s['ltc_prices_usd']: for shares in s['shares']: equity=D(s['ltc'])*D(price)+D(s['cash_usd'])-D(s['liabilities_usd'])-D(s['annual_cost_usd']) nav=equity/D(shares) for ratio in s['price_to_nav']: treasury.append({'ltc_price_usd':price,'shares':shares,'ltc_per_share':str(D(s['ltc'])/D(shares)),'scenario_equity_usd':str(equity),'nav_per_share_usd':str(nav),'price_to_nav':ratio,'scenario_share_price_usd':str(nav*D(ratio))}) return {'attack':attack,'payment_denominator':adoption,'card_sale_scenarios':cards,'synthetic_treasury':treasury} if __name__=='__main__': folder=Path(sys.argv[1] if len(sys.argv)>1 else '.') print(json.dumps(analyze(folder),indent=2))