365 lines
13 KiB
Python
365 lines
13 KiB
Python
#!/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✅ Калькулятор готов!")
|