montana/Русский/Экономика/банк_времени/код/price_calculator.py

365 lines
13 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
price_calculator.py Расчёт цены Montana
Montana Protocol
Якорь Beeple: $69.3M / 5000 дней = $0.1605/сек
"""
from typing import Optional
from datetime import datetime, timezone
# ═══════════════════════════════════════════════════════════════════════════
# КОНСТАНТЫ BEEPLE ANCHOR
# ═══════════════════════════════════════════════════════════════════════════
class BeepleAnchor:
"""
Якорь Beeple фиксация цены Montana через продажу Beeple NFT
История:
- 11 марта 2021: Beeple "Everydays: The First 5000 Days" продан за $69.3M
- Расчёт: $69.3M / 5000 дней = $13,860/день = $0.1605/сек
Этот якорь связывает Montana с реальным миром через исторический момент
"""
# Genesis фиксация
SALE_PRICE_USD = 69_346_250.00 # Цена продажи Beeple NFT в USD
TOTAL_DAYS = 5000 # Количество дней в работе
SALE_DATE = "2021-03-11" # Дата продажи
# Вычисленные константы
USD_PER_DAY = SALE_PRICE_USD / TOTAL_DAYS # $13,869.25/день
USD_PER_HOUR = USD_PER_DAY / 24 # $577.885/час
USD_PER_MINUTE = USD_PER_HOUR / 60 # $9.6314/минута
USD_PER_SECOND = USD_PER_MINUTE / 60 # $0.1605/секунда
# Соотношение Montana:USD
# 1 секунда Montana = 1 MTA
# 1 MTA = $0.1605
MTA_PER_SECOND = 1.0
USD_PER_MTA = USD_PER_SECOND
# ═══════════════════════════════════════════════════════════════════════════
# PRICE CALCULATOR
# ═══════════════════════════════════════════════════════════════════════════
def mta_to_usd(mta_amount: float) -> float:
"""
Конвертировать Montana в USD
Args:
mta_amount: Количество MTA (секунды)
Returns:
Эквивалент в USD
Example:
>>> mta_to_usd(600) # 10 минут
96.3
"""
return mta_amount * BeepleAnchor.USD_PER_MTA
def usd_to_mta(usd_amount: float) -> float:
"""
Конвертировать USD в Montana
Args:
usd_amount: Количество USD
Returns:
Эквивалент в MTA (секунды)
Example:
>>> usd_to_mta(0.1605) # $0.1605
1.0
"""
return usd_amount / BeepleAnchor.USD_PER_MTA
def seconds_to_usd(seconds: int) -> float:
"""
Конвертировать секунды присутствия в USD
Args:
seconds: Количество секунд
Returns:
Эквивалент в USD
Example:
>>> seconds_to_usd(600) # 10 минут
96.3
"""
return seconds * BeepleAnchor.USD_PER_SECOND
def usd_to_seconds(usd_amount: float) -> float:
"""
Конвертировать USD в секунды присутствия
Args:
usd_amount: Количество USD
Returns:
Эквивалент в секундах
Example:
>>> usd_to_seconds(96.3) # $96.3
600.0
"""
return usd_amount / BeepleAnchor.USD_PER_SECOND
def days_to_usd(days: float) -> float:
"""
Конвертировать дни работы в USD
Args:
days: Количество дней
Returns:
Эквивалент в USD
Example:
>>> days_to_usd(1) # 1 день
13869.25
"""
return days * BeepleAnchor.USD_PER_DAY
def usd_to_days(usd_amount: float) -> float:
"""
Конвертировать USD в дни работы
Args:
usd_amount: Количество USD
Returns:
Эквивалент в днях
Example:
>>> usd_to_days(13869.25) # $13,869.25
1.0
"""
return usd_amount / BeepleAnchor.USD_PER_DAY
def get_anchor_info() -> dict:
"""
Получить информацию о якоре Beeple
Returns:
{
"sale_price_usd": 69346250.0,
"total_days": 5000,
"sale_date": "2021-03-11",
"usd_per_second": 0.1605,
"usd_per_minute": 9.6314,
"usd_per_hour": 577.885,
"usd_per_day": 13869.25,
"mta_per_second": 1.0,
"usd_per_mta": 0.1605
}
"""
return {
"sale_price_usd": BeepleAnchor.SALE_PRICE_USD,
"total_days": BeepleAnchor.TOTAL_DAYS,
"sale_date": BeepleAnchor.SALE_DATE,
"usd_per_second": BeepleAnchor.USD_PER_SECOND,
"usd_per_minute": BeepleAnchor.USD_PER_MINUTE,
"usd_per_hour": BeepleAnchor.USD_PER_HOUR,
"usd_per_day": BeepleAnchor.USD_PER_DAY,
"mta_per_second": BeepleAnchor.MTA_PER_SECOND,
"usd_per_mta": BeepleAnchor.USD_PER_MTA
}
def format_price(usd_amount: float, currency: str = "USD") -> str:
"""
Форматировать цену для отображения
Args:
usd_amount: Сумма в USD
currency: Валюта (USD, EUR, RUB, etc.)
Returns:
Отформатированная строка
Example:
>>> format_price(96.31)
"$96.31 USD"
"""
if currency == "USD":
return f"${usd_amount:.2f} USD"
elif currency == "MTA":
mta = usd_to_mta(usd_amount)
return f"{mta:.2f} MTA"
else:
return f"{usd_amount:.2f} {currency}"
# ═══════════════════════════════════════════════════════════════════════════
# PIZZA DAY MECHANISM
# ═══════════════════════════════════════════════════════════════════════════
class PizzaDayCalculator:
"""
Pizza Day механизм переоценка якоря через Pizza Day
История:
- 22 мая 2010: 10,000 BTC = 2 пиццы ($25)
- 22 мая 2021: 10,000 BTC = $390M
Механизм:
- Каждый Pizza Day (22 мая) можно переоценить якорь
- Старый якорь: Beeple $69.3M / 5000 дней
- Новый якорь: актуальная оценка творческой работы
"""
PIZZA_DAY_MONTH = 5 # Май
PIZZA_DAY_DAY = 22 # 22-е число
@staticmethod
def is_pizza_day(date: datetime = None) -> bool:
"""
Проверить, является ли дата Pizza Day
Args:
date: Дата для проверки (по умолчанию сегодня)
Returns:
True если 22 мая
"""
if date is None:
date = datetime.now(timezone.utc)
return (date.month == PizzaDayCalculator.PIZZA_DAY_MONTH and
date.day == PizzaDayCalculator.PIZZA_DAY_DAY)
@staticmethod
def days_until_pizza_day(date: datetime = None) -> int:
"""
Сколько дней до следующего Pizza Day
Args:
date: Дата отсчёта (по умолчанию сегодня)
Returns:
Количество дней до 22 мая
"""
if date is None:
date = datetime.now(timezone.utc)
current_year = date.year
pizza_day_this_year = datetime(
current_year,
PizzaDayCalculator.PIZZA_DAY_MONTH,
PizzaDayCalculator.PIZZA_DAY_DAY,
tzinfo=timezone.utc
)
if date > pizza_day_this_year:
# Pizza Day уже прошёл в этом году, считаем до следующего
pizza_day_next_year = datetime(
current_year + 1,
PizzaDayCalculator.PIZZA_DAY_MONTH,
PizzaDayCalculator.PIZZA_DAY_DAY,
tzinfo=timezone.utc
)
delta = pizza_day_next_year - date
else:
# Pizza Day ещё не прошёл в этом году
delta = pizza_day_this_year - date
return delta.days
@staticmethod
def recalculate_anchor(new_sale_price: float, new_total_days: int) -> dict:
"""
Пересчитать якорь с новыми значениями
Args:
new_sale_price: Новая цена продажи (USD)
new_total_days: Новое количество дней работы
Returns:
Новые константы якоря
Example:
>>> PizzaDayCalculator.recalculate_anchor(100_000_000, 10_000)
{"usd_per_second": 0.1157, ...}
"""
usd_per_day = new_sale_price / new_total_days
usd_per_hour = usd_per_day / 24
usd_per_minute = usd_per_hour / 60
usd_per_second = usd_per_minute / 60
return {
"sale_price_usd": new_sale_price,
"total_days": new_total_days,
"usd_per_day": usd_per_day,
"usd_per_hour": usd_per_hour,
"usd_per_minute": usd_per_minute,
"usd_per_second": usd_per_second,
"mta_per_second": 1.0,
"usd_per_mta": usd_per_second
}
# ═══════════════════════════════════════════════════════════════════════════
# EXPORTS
# ═══════════════════════════════════════════════════════════════════════════
__all__ = [
'BeepleAnchor',
'mta_to_usd',
'usd_to_mta',
'seconds_to_usd',
'usd_to_seconds',
'days_to_usd',
'usd_to_days',
'get_anchor_info',
'format_price',
'PizzaDayCalculator'
]
# ═══════════════════════════════════════════════════════════════════════════
# CLI
# ═══════════════════════════════════════════════════════════════════════════
if __name__ == "__main__":
print("🏔 Montana Price Calculator")
print("=" * 60)
# Показать якорь
print("\n📍 Якорь Beeple:")
print(f" Цена продажи: ${BeepleAnchor.SALE_PRICE_USD:,.2f}")
print(f" Количество дней: {BeepleAnchor.TOTAL_DAYS}")
print(f" Дата продажи: {BeepleAnchor.SALE_DATE}")
print(f"\n USD/секунда: ${BeepleAnchor.USD_PER_SECOND:.4f}")
print(f" USD/минута: ${BeepleAnchor.USD_PER_MINUTE:.4f}")
print(f" USD/час: ${BeepleAnchor.USD_PER_HOUR:.2f}")
print(f" USD/день: ${BeepleAnchor.USD_PER_DAY:,.2f}")
# Примеры конвертации
print("\n💰 Примеры конвертации:")
print(f" 600 сек (10 мин) = {format_price(seconds_to_usd(600))}")
print(f" 3600 сек (1 час) = {format_price(seconds_to_usd(3600))}")
print(f" 86400 сек (1 день) = {format_price(seconds_to_usd(86400))}")
print(f"\n $100 = {usd_to_seconds(100):.0f} секунд ({usd_to_seconds(100)/60:.1f} минут)")
print(f" $1000 = {usd_to_seconds(1000):.0f} секунд ({usd_to_seconds(1000)/3600:.1f} часов)")
# Pizza Day
print("\n🍕 Pizza Day Mechanism:")
print(f" Сегодня Pizza Day? {PizzaDayCalculator.is_pizza_day()}")
print(f" Дней до Pizza Day: {PizzaDayCalculator.days_until_pizza_day()}")
print("\n✅ Калькулятор готов!")