You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

228 lines
8.8 KiB

#!/usr/bin/env python3
"""
PoWHD Pricing Simulation
Demonstrates how the bonding curve pricing works in pyramid contracts
"""
import matplotlib.pyplot as plt
import numpy as np
class PoWHDSimulator:
def __init__(self):
# Constants from the contract
self.initial_price = 0.0000001 # ETH
self.price_increment = 0.00000001 # ETH
self.dividend_fee = 0.10 # 10%
self.referral_fee = 0.03 # 3%
# State variables
self.token_supply = 0
self.total_eth_in = 0
self.total_dividends = 0
def calculate_buy_price(self, token_amount=1):
"""Calculate price to buy specified number of tokens"""
if self.token_supply == 0:
return self.initial_price + self.price_increment
# Simplified linear approximation for demonstration
current_price = self.initial_price + (self.token_supply * self.price_increment)
return current_price
def calculate_tokens_for_eth(self, eth_amount):
"""Calculate how many tokens you get for ETH (after fees)"""
# Deduct fees first
after_fees = eth_amount * (1 - self.dividend_fee - self.referral_fee)
# Simplified calculation (real contract uses quadratic formula)
if self.token_supply == 0:
tokens = after_fees / (self.initial_price + self.price_increment)
else:
current_price = self.initial_price + (self.token_supply * self.price_increment)
tokens = after_fees / current_price
return tokens
def buy_tokens(self, eth_amount, has_referrer=False):
"""Simulate buying tokens"""
# Calculate fees
dividend_fee_amount = eth_amount * self.dividend_fee
referral_fee_amount = eth_amount * self.referral_fee if has_referrer else 0
net_eth = eth_amount - dividend_fee_amount - referral_fee_amount
# Calculate tokens received
tokens = self.calculate_tokens_for_eth(eth_amount)
# Update state
self.token_supply += tokens
self.total_eth_in += eth_amount
self.total_dividends += dividend_fee_amount
return tokens, net_eth, dividend_fee_amount, referral_fee_amount
def simulate_pyramid_lifecycle(self, investors=100):
"""Simulate a complete pyramid lifecycle"""
results = []
# Early investors (get good deals)
for i in range(20):
eth_investment = 0.1 + (i * 0.05) # 0.1 to 1.0 ETH
tokens, net_eth, div_fee, ref_fee = self.buy_tokens(eth_investment, has_referrer=(i>5))
results.append({
'investor': i+1,
'phase': 'Early',
'eth_invested': eth_investment,
'tokens_received': tokens,
'price_per_token': eth_investment / tokens if tokens > 0 else 0,
'total_supply': self.token_supply,
'total_eth_in': self.total_eth_in
})
# Middle investors (prices rising)
for i in range(20, 70):
eth_investment = 0.5 + (i * 0.02) # Increasing investments
tokens, net_eth, div_fee, ref_fee = self.buy_tokens(eth_investment, has_referrer=True)
results.append({
'investor': i+1,
'phase': 'Growth',
'eth_invested': eth_investment,
'tokens_received': tokens,
'price_per_token': eth_investment / tokens if tokens > 0 else 0,
'total_supply': self.token_supply,
'total_eth_in': self.total_eth_in
})
# Late investors (very expensive)
for i in range(70, investors):
eth_investment = 1.0 + (i * 0.1) # Large investments, few tokens
tokens, net_eth, div_fee, ref_fee = self.buy_tokens(eth_investment, has_referrer=True)
results.append({
'investor': i+1,
'phase': 'Late',
'eth_invested': eth_investment,
'tokens_received': tokens,
'price_per_token': eth_investment / tokens if tokens > 0 else 0,
'total_supply': self.token_supply,
'total_eth_in': self.total_eth_in
})
return results
def plot_results(results):
"""Create visualizations of the pyramid mechanics"""
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 12))
investors = [r['investor'] for r in results]
prices = [r['price_per_token'] for r in results]
tokens = [r['tokens_received'] for r in results]
total_supply = [r['total_supply'] for r in results]
eth_invested = [r['eth_invested'] for r in results]
# Color code by phase
colors = []
for r in results:
if r['phase'] == 'Early':
colors.append('green')
elif r['phase'] == 'Growth':
colors.append('orange')
else:
colors.append('red')
# Plot 1: Price per token over time
ax1.scatter(investors, prices, c=colors, alpha=0.7)
ax1.set_xlabel('Investor Number')
ax1.set_ylabel('Price per Token (ETH)')
ax1.set_title('Token Price Escalation')
ax1.set_yscale('log')
# Plot 2: Tokens received vs ETH invested
ax2.scatter(eth_invested, tokens, c=colors, alpha=0.7)
ax2.set_xlabel('ETH Invested')
ax2.set_ylabel('Tokens Received')
ax2.set_title('Diminishing Returns')
ax2.set_yscale('log')
# Plot 3: Total token supply growth
ax3.plot(investors, total_supply, 'b-', linewidth=2)
ax3.set_xlabel('Investor Number')
ax3.set_ylabel('Total Token Supply')
ax3.set_title('Token Supply Growth')
# Plot 4: ETH investment amounts
ax4.bar(investors, eth_invested, color=colors, alpha=0.7)
ax4.set_xlabel('Investor Number')
ax4.set_ylabel('ETH Invested')
ax4.set_title('Investment Amounts by Phase')
# Add legend
from matplotlib.patches import Patch
legend_elements = [
Patch(facecolor='green', label='Early Investors (Profit)'),
Patch(facecolor='orange', label='Growth Phase'),
Patch(facecolor='red', label='Late Investors (Likely Loss)')
]
fig.legend(handles=legend_elements, loc='upper right')
plt.tight_layout()
plt.savefig('/home/crappy/ponzi/pyramid_analysis.png', dpi=300, bbox_inches='tight')
print("Visualization saved as 'pyramid_analysis.png'")
def print_analysis(results):
"""Print detailed analysis of the pyramid"""
print("\n" + "="*60)
print("PYRAMID ANALYSIS RESULTS")
print("="*60)
early_investors = [r for r in results if r['phase'] == 'Early']
late_investors = [r for r in results if r['phase'] == 'Late']
print(f"\nEARLY INVESTORS (First 20):")
print(f" Average price per token: {np.mean([r['price_per_token'] for r in early_investors]):.8f} ETH")
print(f" Average tokens received: {np.mean([r['tokens_received'] for r in early_investors]):.2f}")
print(f" Total ETH invested: {sum([r['eth_invested'] for r in early_investors]):.2f} ETH")
print(f"\nLATE INVESTORS (Last 30):")
print(f" Average price per token: {np.mean([r['price_per_token'] for r in late_investors]):.8f} ETH")
print(f" Average tokens received: {np.mean([r['tokens_received'] for r in late_investors]):.2f}")
print(f" Total ETH invested: {sum([r['eth_invested'] for r in late_investors]):.2f} ETH")
price_ratio = (np.mean([r['price_per_token'] for r in late_investors]) /
np.mean([r['price_per_token'] for r in early_investors]))
print(f"\nPRICE ESCALATION:")
print(f" Late investors pay {price_ratio:.1f}x more per token than early investors")
total_eth = results[-1]['total_eth_in']
print(f"\nOVERALL PYRAMID:")
print(f" Total ETH collected: {total_eth:.2f} ETH")
print(f" Total tokens issued: {results[-1]['total_supply']:.2f}")
print(f" Average price per token: {total_eth / results[-1]['total_supply']:.8f} ETH")
if __name__ == "__main__":
print("Simulating PoWHD Pyramid Contract...")
# Create simulator and run simulation
sim = PoWHDSimulator()
results = sim.simulate_pyramid_lifecycle(100)
# Generate analysis
print_analysis(results)
try:
plot_results(results)
except ImportError:
print("\nMatplotlib not available - skipping visualization")
print("Install with: pip install matplotlib")
print("\n" + "="*60)
print("KEY TAKEAWAYS:")
print("="*60)
print("1. Early investors get tokens much cheaper")
print("2. Price escalates exponentially with more participants")
print("3. Late investors pay premium prices for fewer tokens")
print("4. System requires constant new money to sustain")
print("5. Mathematical certainty that late investors will lose")
print("="*60)