#!/usr/bin/env -S uv run python """Reperform Linden Peak's resource, depletion, and retirement schedules. Run directly with uv. This lab uses only the Python standard library: uv run python linden-peak-resource-and-retirement.py """ from __future__ import annotations def money(amount: float) -> str: """Format dollars with commas and accounting-style negatives.""" if abs(amount) < 0.005: return "—" if amount < 0: return f"(${abs(amount):,.2f})" return f"${amount:,.2f}" def quantity(amount: float) -> str: """Format resource units with grouping separators.""" return f"{amount:,.0f}" def main() -> None: resource_costs = {"Mineral rights": 1_200_000.0, "Development": 400_000.0} scenarios = [ ("Base case", 400_000.0, 0.70), ("High case", 520_000.0, 0.30), ] years_to_settlement = 5 discount_rate = 0.06 expected_cash_flow = sum(cash_flow * probability for _, cash_flow, probability in scenarios) initial_aro = expected_cash_flow / (1 + discount_rate) ** years_to_settlement asset_retirement_cost = initial_aro print("LINDEN PEAK — RESOURCE AND RETIREMENT TRACE") print("Scope: arithmetic after legal scope, scenarios, reserve units, and rates are supplied") print() print("1 · INITIAL ASSET RETIREMENT OBLIGATION") print(f" {'Scenario':16} {'Cash flow':>16} {'Probability':>14} {'Weighted':>16}") for label, cash_flow, probability in scenarios: print( f" {label:16} {money(cash_flow):>16} {probability:>13.2%} " f"{money(cash_flow * probability):>16}" ) print(f" {'Expected cash flow':16} {'':>16} {'100.00%':>14} {money(expected_cash_flow):>16}") print(f" {'Initial ARO':16} {'':>16} {'':>14} {money(initial_aro):>16}") residual_value = 100_000.0 recoverable_units = 900_000.0 depletable_base = sum(resource_costs.values()) + asset_retirement_cost - residual_value depletion_rate = depletable_base / recoverable_units units_extracted = 120_000.0 units_sold = 95_000.0 ending_inventory_units = units_extracted - units_sold extraction_depletion = units_extracted * depletion_rate depletion_expense = units_sold * depletion_rate inventory_depletion = ending_inventory_units * depletion_rate ending_resource_carrying = ( sum(resource_costs.values()) + asset_retirement_cost - extraction_depletion ) print() print("2 · DEPLETABLE BASE") print(f" {'Resource cost':30} {money(sum(resource_costs.values())):>16}") print(f" {'Asset retirement cost':30} {money(asset_retirement_cost):>16}") print(f" {'Residual value':30} {money(-residual_value):>16}") print(f" {'Depletable base':30} {money(depletable_base):>16}") print(f" {'Recoverable units':30} {quantity(recoverable_units):>16}") print(f" {'Depletion per unit':30} {money(depletion_rate):>16}") print() print("3 · EXTRACTION, INVENTORY, AND EXPENSE") print(f" {'Destination':24} {'Units':>14} {'Depletion':>18}") print( f" {'Expense on units sold':24} {quantity(units_sold):>14} " f"{money(depletion_expense):>18}" ) print( f" {'Ending inventory':24} {quantity(ending_inventory_units):>14} " f"{money(inventory_depletion):>18}" ) print( f" {'Current extraction':24} {quantity(units_extracted):>14} " f"{money(extraction_depletion):>18}" ) allocation_check = depletion_expense + inventory_depletion - extraction_depletion print(f" {'Allocation check':24} {'':>14} {money(allocation_check):>18}") print(f" {'Ending resource carrying':24} {'':>14} {money(ending_resource_carrying):>18}") aro_after_one_year = initial_aro * (1 + discount_rate) accretion = aro_after_one_year - initial_aro print() print("4 · LIABILITY ROLLFORWARD") print(f" {'Opening ARO':30} {money(initial_aro):>16}") print(f" {'Accretion expense':30} {money(accretion):>16}") print(f" {'Ending ARO':30} {money(aro_after_one_year):>16}") print() print("The trace verifies supplied arithmetic only. It does not prove legal scope,") print("engineering cash flows, reserve quantities, rate selection, or unit ownership.") if __name__ == "__main__": main()