Commit before cuna

This commit is contained in:
2025-09-04 02:48:34 +02:00
parent 7e55515063
commit 8ef7f0b9f1
32 changed files with 4668 additions and 17 deletions

307
create_stakes_python.py Normal file
View File

@@ -0,0 +1,307 @@
#!/usr/bin/env python3
import os
from web3 import Web3
from datetime import datetime
import json
from dotenv import load_dotenv
# Load environment variables from .env file
load_dotenv()
# Configuration
BASE_RPC_URL = "https://mainnet.base.org" # Base mainnet RPC
CONTRACT_ADDRESS = "0xDf2027318D27c4eD1C047B4d6247A7a705bb407b" # Base contract address
PRIVATE_KEY = os.getenv('PRIVATE_KEY') # Read from .env file
# Contract ABI - createStakes and clearStakes functions
CONTRACT_ABI = [
{
"inputs": [
{
"components": [
{"internalType": "address", "name": "user", "type": "address"},
{"internalType": "uint256", "name": "amount", "type": "uint256"},
{"internalType": "uint256", "name": "lastClaimed", "type": "uint256"},
{"internalType": "uint256", "name": "unlockTime", "type": "uint256"},
{"internalType": "uint256", "name": "dailyRewardRate", "type": "uint256"}
],
"internalType": "struct PacaFinanceWithBoostAndScheduleBase.StakeInput[]",
"name": "stakesInput",
"type": "tuple[]"
}
],
"name": "createStakes",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{"internalType": "address", "name": "user", "type": "address"}
],
"name": "clearStakes",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
# Convert CSV-like data to timestamp
def parse_date(date_str):
"""Convert 'YYYY-MM-DD HH:MM:SS' to Unix timestamp"""
dt = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
return int(dt.timestamp())
# Stakes data with amounts from CSV and correct unlock times from original stakes
# Format: (stake_id, address, amount, original_amount, last_claimed_str, pool_id, rewards, lockup_period, reward_rate, csv_unlock_time, complete)
stakes_data = [
(0, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 500000000, 500000000, "2025-06-02 02:32:14", 0, 1557129, 64, 40, 64, "no"),
(1, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 555000000, 555000000, "2025-06-02 02:32:14", 1, 1728413, 64, 40, 64, "no"),
(2, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 100000000, 100000000, "2025-06-02 02:32:14", 2, 319211, 64, 41, 64, "no"),
(3, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 500000000, 500000000, "2025-05-31 02:32:14", 3, 1557129, 66, 40, 66, "no"),
(4, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 5000000, 5000000, "2025-05-31 02:32:14", 4, 15571, 66, 40, 66, "no"),
(5, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 64249391, 64249391, "2025-05-23 02:32:14", 5, 170075, 74, 34, 74, "no"),
(6, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 60020374, 60020374, "2025-05-14 02:32:14", 6, 158881, 83, 34, 83, "no"),
(7, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 28330011, 28330011, "2025-05-10 02:32:14", 7, 90432, 87, 41, 87, "no"),
(8, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 49737274, 49737274, "2025-05-03 02:32:14", 8, 158767, 94, 41, 94, "no"),
(9, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 29634199, 29634199, "2025-04-29 02:32:14", 9, 94595, 98, 41, 98, "no"),
(10, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 23048084, 23048084, "2025-04-26 02:32:14", 10, 61011, 101, 34, 101, "no"),
(11, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 22707593, 22707593, "2025-04-23 02:32:14", 11, 60109, 104, 34, 104, "no"),
(12, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 25345568, 25345568, "2025-04-20 02:32:14", 12, 67092, 107, 34, 107, "no"),
(13, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 36625321, 36625321, "2025-04-15 02:32:14", 13, 96951, 112, 34, 112, "no"),
(14, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 31761689, 31761689, "2025-04-11 02:32:14", 14, 84077, 116, 34, 116, "no"),
(15, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 23054529, 23054529, "2025-04-08 02:32:14", 15, 70002, 119, 39, 119, "no"),
(16, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 762540000, 762540000, "2025-04-08 02:32:14", 16, 2315378, 119, 39, 119, "no"),
(17, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 33544394, 33544394, "2025-04-05 02:32:14", 17, 107077, 122, 41, 122, "no"),
(18, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 45207172, 45207172, "2025-04-01 02:32:14", 18, 119668, 126, 34, 126, "no"),
(19, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 38218086, 38218086, "2025-03-29 02:32:14", 19, 101167, 129, 34, 129, "no"),
(20, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 41700000, 41700000, "2025-03-29 02:32:14", 20, 110384, 129, 34, 129, "no"),
(21, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 23741006, 23741006, "2025-03-27 02:32:14", 21, 62845, 131, 34, 131, "no"),
(22, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 46927685, 46927685, "2025-03-23 02:32:14", 22, 124223, 135, 34, 135, "no"),
(23, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 120000000, 120000000, "2025-03-22 02:32:14", 23, 383053, 136, 41, 136, "no"),
(24, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 115000000, 115000000, "2025-03-22 02:32:14", 24, 367093, 136, 41, 136, "no"),
(25, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 45147055, 45147055, "2025-03-19 02:32:14", 25, 144114, 139, 41, 139, "no"),
(26, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 41042676, 41042676, "2025-03-16 02:32:14", 26, 131012, 142, 41, 142, "no"),
(27, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 43109632, 43109632, "2025-03-13 02:32:14", 27, 114116, 145, 34, 145, "no"),
(28, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 25191734, 25191734, "2025-03-11 02:32:14", 28, 66685, 147, 34, 147, "no"),
(29, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 49039377, 49039377, "2025-03-07 02:32:14", 29, 148903, 151, 39, 151, "no"),
(30, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 30703113, 30703113, "2025-03-05 02:32:14", 30, 93227, 153, 39, 153, "no"),
(31, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 40403249, 40403249, "2025-03-02 02:32:14", 31, 122680, 156, 39, 156, "no"),
(32, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 52333588, 52333588, "2025-02-26 02:32:14", 32, 138533, 160, 34, 160, "no"),
(33, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 47850170, 47850170, "2025-02-23 02:32:14", 33, 126665, 163, 34, 163, "no"),
(34, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 36399553, 36399553, "2025-02-20 02:32:14", 34, 96353, 166, 34, 166, "no"),
(35, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 29872672, 29872672, "2024-10-26 02:32:14", 35, 95357, 283, 41, 283, "no"),
(36, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 1265200000, 1265200000, "2024-10-25 02:32:14", 36, 4038664, 284, 41, 284, "no"),
(37, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 60141052, 60141052, "2024-10-21 02:32:14", 37, 191977, 288, 41, 288, "no"),
(38, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 1000000000, 1000000000, "2024-10-20 02:32:14", 38, 3192115, 289, 41, 289, "no"),
(39, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 106040000, 106040000, "2024-10-17 02:32:14", 39, 338491, 292, 41, 292, "no"),
(40, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 49348009, 49348009, "2025-02-04 02:32:14", 40, 130630, 182, 34, 182, "no"),
(41, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 49649369, 49649369, "2025-02-02 02:32:14", 41, 131427, 184, 34, 184, "no"),
(42, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 602810000, 602810000, "2025-01-31 02:32:14", 42, 1595710, 186, 34, 186, "no"),
(43, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 55147108, 55147108, "2025-01-29 02:32:14", 43, 145981, 188, 34, 188, "no"),
(44, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 86517786, 86517786, "2025-01-26 02:32:14", 44, 255966, 191, 38, 191, "no"),
(45, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 1722950000, 1722950000, "2025-01-23 02:32:14", 45, 5097427, 194, 38, 194, "no"),
(46, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 1280990000, 1280990000, "2025-01-21 02:32:14", 46, 3789868, 196, 38, 196, "no"),
(47, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 65944936, 65944936, "2025-01-19 02:32:14", 47, 210503, 198, 41, 198, "no"),
(48, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 812080000, 812080000, "2025-01-19 02:32:14", 48, 2592253, 198, 41, 198, "no"),
(49, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 1167490000, 1167490000, "2025-01-17 02:32:14", 49, 3726763, 200, 41, 200, "no"),
(50, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 200690000, 200690000, "2025-01-15 02:32:14", 50, 640625, 202, 41, 202, "no"),
(51, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 77691951, 77691951, "2025-01-14 02:32:14", 51, 248001, 203, 41, 203, "no"),
(52, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 992680000, 992680000, "2025-01-14 02:32:14", 52, 3168749, 203, 41, 203, "no"),
(53, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 1750000000, 1750000000, "2025-01-10 02:32:14", 53, 5586202, 207, 41, 207, "no"),
(54, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 1276680000, 1276680000, "2025-01-07 02:32:14", 54, 4075310, 210, 41, 210, "no"),
(55, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 31529749, 31529749, "2025-01-03 02:32:14", 55, 100646, 214, 41, 214, "no"),
(56, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 86528141, 86528141, "2025-01-02 02:32:14", 56, 229050, 215, 34, 215, "no"),
(57, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 228548767, 228548767, "2024-12-29 02:32:14", 57, 729554, 219, 41, 219, "no"),
(58, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 135560922, 135560922, "2024-12-27 02:32:14", 58, 358846, 221, 34, 221, "no"),
(59, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 107108280, 107108280, "2024-12-26 02:32:14", 59, 283528, 222, 34, 222, "no"),
(60, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 367606256, 367606256, "2024-12-20 02:32:14", 60, 973098, 228, 34, 228, "no"),
(61, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 116416549, 116416549, "2024-12-18 02:32:14", 61, 308168, 230, 34, 230, "no"),
(62, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 50417595, 50417595, "2024-12-18 02:32:14", 62, 160938, 230, 41, 230, "no"),
(63, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 82748602, 82748602, "2024-12-16 02:32:14", 63, 219045, 232, 34, 232, "no"),
(64, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 1680040000, 1680040000, "2024-12-13 02:32:14", 64, 4447268, 235, 34, 235, "no"),
(65, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 2478600000, 2478600000, "2024-08-15 02:32:14", 65, 8104953, 355, 42, 355, "no"),
(66, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 825000000, 825000000, "2024-08-13 02:32:14", 66, 2697727, 357, 42, 357, "no"),
(67, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 1321260000, 1321260000, "2024-12-03 02:32:14", 67, 3600402, 245, 35, 245, "no"),
(68, "0xe1AbEC319515757e77482337eE1f99ccA2E1A500", 203269777, 203269777, "2024-12-01 02:32:14", 68, 553905, 247, 35, 247, "no"),
]
# Correct unlock times from original stakes data (in same order)
# Format: [amount, lastClaimed, dailyRewardRate, unlockTime, complete]
original_unlock_times = [
1759891211, 1759891305, 1759918669, 1760077071, 1760088359, 1760784185, 1761539197, 1761885285,
1762483073, 1762829419, 1763094435, 1763352841, 1763638363, 1764046369, 1764394603, 1764643955,
1764644281, 1764906275, 1765255337, 1765546435, 1765546657, 1765723037, 1766069703, 1766116935,
1766118637, 1766377609, 1766650301, 1766933067, 1767096487, 1767412575, 1767607691, 1767862209,
1768188137, 1768482369, 1768703629, 1778819647, 1778947171, 1779252457, 1779331565, 1779633187,
1770087661, 1770262065, 1770438873, 1770616539, 1770893373, 1771123569, 1771308419, 1771455451,
1771514943, 1771687647, 1771825181, 1771965131, 1771965439, 1772301051, 1772560007, 1772864375,
1772979599, 1773282569, 1773459725, 1773598729, 1774073209, 1774220717, 1774284231, 1774388161,
1774720189, 1785097545, 1785208749, 1775513771, 1775702013
]
def main():
if not PRIVATE_KEY:
print("ERROR: Please set the PRIVATE_KEY environment variable")
return
# Connect to Base
print("Connecting to Base network...")
w3 = Web3(Web3.HTTPProvider(BASE_RPC_URL))
if not w3.is_connected():
print("ERROR: Could not connect to Base network")
return
print(f"Connected to Base! Latest block: {w3.eth.block_number}")
# Setup account
account = w3.eth.account.from_key(PRIVATE_KEY)
print(f"Using account: {account.address}")
# Setup contract
contract = w3.eth.contract(
address=Web3.to_checksum_address(CONTRACT_ADDRESS),
abi=CONTRACT_ABI
)
# Prepare stakes data for the contract
stakes_input = []
for i, stake in enumerate(stakes_data):
stake_id, address, amount, original_amount, last_claimed_str, pool_id, rewards, lockup_period, reward_rate, csv_unlock_time, complete = stake
# Use the correct values from original stakes data
last_claimed_timestamp = 1754275845 # From original stakes data (same for all)
unlock_time = original_unlock_times[i] # Use corresponding unlock time from original data
# Create stake input (mapping to contract struct)
# StakeInput: user, amount, lastClaimed, unlockTime, dailyRewardRate
stake_input = {
'user': Web3.to_checksum_address(address),
'amount': amount, # Amount from CSV data
'lastClaimed': last_claimed_timestamp, # From original stakes (more accurate)
'unlockTime': unlock_time, # From original stakes (correct unlock times)
'dailyRewardRate': reward_rate # From CSV data
}
stakes_input.append(stake_input)
print(f"Prepared {len(stakes_input)} stakes for submission")
# First, clear existing stakes for the user
# user_address = Web3.to_checksum_address("0xe1AbEC319515757e77482337eE1f99ccA2E1A500")
# print(f"\n🧹 Step 1: Clearing existing stakes for {user_address}")
# Get current gas price and nonce
gas_price = w3.eth.gas_price
print(f"Current gas price: {w3.from_wei(gas_price, 'gwei')} Gwei")
nonce = w3.eth.get_transaction_count(account.address)
# Build clearStakes transaction
# try:
# clear_gas_estimate = contract.functions.clearStakes(user_address).estimate_gas({
# 'from': account.address
# })
# print(f"Clear stakes gas estimate: {clear_gas_estimate}")
# except Exception as e:
# print(f"ERROR: Clear stakes gas estimation failed: {e}")
# return
# clear_transaction = contract.functions.clearStakes(user_address).build_transaction({
# 'from': account.address,
# 'gas': int(clear_gas_estimate * 1.2),
# 'gasPrice': gas_price,
# 'nonce': nonce,
# 'value': 0
# })
# print(f"Clear stakes transaction:")
# print(f" Gas: {clear_transaction['gas']}")
# print(f" Est. cost: {w3.from_wei(clear_transaction['gas'] * clear_transaction['gasPrice'], 'ether')} ETH")
# Ask for confirmation
# confirm_clear = input("\nDo you want to clear existing stakes first? (yes/no): ")
# if confirm_clear.lower() != 'yes':
# print("Operation cancelled")
# return
# Sign and send clear transaction
# print("\n🚀 Sending clearStakes transaction...")
# signed_clear_txn = w3.eth.account.sign_transaction(clear_transaction, private_key=PRIVATE_KEY)
# clear_tx_hash = w3.eth.send_raw_transaction(signed_clear_txn.raw_transaction)
# print(f"Clear transaction sent! Hash: {clear_tx_hash.hex()}")
# Wait for clear transaction confirmation
# print("Waiting for clear transaction confirmation...")
# clear_tx_receipt = w3.eth.wait_for_transaction_receipt(clear_tx_hash)
# if clear_tx_receipt.status != 1:
# print(f"❌ Clear transaction failed! Hash: {clear_tx_receipt.transactionHash.hex()}")
# return
# print(f"✅ Existing stakes cleared successfully!")
# print(f" Block: {clear_tx_receipt.blockNumber}")
# print(f" Gas used: {clear_tx_receipt.gasUsed}")
print(f"\n🏗️ Creating {len(stakes_input)} new stakes")
# Get nonce for transaction
# nonce = w3.eth.get_transaction_count(account.address)
# Estimate gas
try:
gas_estimate = contract.functions.createStakes(stakes_input).estimate_gas({
'from': account.address,
'value': 0 # No ETH being sent
})
print(f"Estimated gas: {gas_estimate}")
except Exception as e:
print(f"ERROR: Gas estimation failed: {e}")
return
# Build the transaction
transaction = contract.functions.createStakes(stakes_input).build_transaction({
'from': account.address,
'gas': int(gas_estimate * 1.2), # Add 20% buffer
'gasPrice': gas_price,
'nonce': nonce,
'value': 0
})
print(f"Transaction details:")
print(f" To: {transaction['to']}")
print(f" Gas: {transaction['gas']}")
print(f" Gas Price: {w3.from_wei(transaction['gasPrice'], 'gwei')} Gwei")
print(f" Est. cost: {w3.from_wei(transaction['gas'] * transaction['gasPrice'], 'ether')} ETH")
# Ask for confirmation
confirm = input("\nDo you want to submit this transaction? (yes/no): ")
if confirm.lower() != 'yes':
print("Transaction cancelled")
return
# Sign and send transaction
print("\nSigning transaction...")
signed_txn = w3.eth.account.sign_transaction(transaction, private_key=PRIVATE_KEY)
print("Sending transaction...")
tx_hash = w3.eth.send_raw_transaction(signed_txn.raw_transaction)
print(f"Transaction sent! Hash: {tx_hash.hex()}")
# Wait for confirmation
print("Waiting for confirmation...")
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
if tx_receipt.status == 1:
print(f"✅ Transaction successful!")
print(f" Block: {tx_receipt.blockNumber}")
print(f" Gas used: {tx_receipt.gasUsed}")
print(f" Transaction hash: {tx_receipt.transactionHash.hex()}")
else:
print(f"❌ Transaction failed!")
print(f" Transaction hash: {tx_receipt.transactionHash.hex()}")
if __name__ == "__main__":
main()