Python Web3.py Tutorial

Build Ethereum dApps using Python. Complete guide to Web3.py for smart contracts, transactions, and DeFi integration.

Prerequisites

  • Python 3.8+ installed
  • Basic understanding of Python
  • Ethereum wallet (MetaMask)
  • ETH for testnet (Sepolia recommended)

Installation

pip install web3
pip install eth-account
pip install eth-abi

Connect to Ethereum

Connect to Ethereum Network

from web3 import Web3

# Connect to Infura (replace with your API key)
infura_url = "https://sepolia.infura.io/v3/YOUR_INFURA_KEY"
w3 = Web3(Web3.HTTPProvider(infura_url))

# Check connection
print(f"Connected: {w3.is_connected()}")

Check Balance

Get ETH Balance

# Check wallet balance
address = "0x742d35Cc6634C0532925a3b844Bc9e7595f0eB1E"
balance = w3.eth.get_balance(address)
print(f"Balance: {w3.from_wei(balance, 'ether')} ETH")

Send Transaction

Send ETH

from eth_account import Account

# Generate account from private key
private_key = "YOUR_PRIVATE_KEY"
account = Account.from_key(private_key)

# Transaction parameters
tx = {
    'nonce': w3.eth.get_transaction_count(account.address),
    'to': '0x742d35Cc6634C0532925a3b844Bc9e7595f0eB1E',
    'value': w3.to_wei(0.01, 'ether'),
    'gas': 21000,
    'gasPrice': w3.eth.gas_price,
    'chainId': 11155111  # Sepolia
}

# Sign and send
signed_tx = account.sign_transaction(tx)
tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction)
print(f"Transaction sent: {tx_hash.hex()}")

Interact with Smart Contracts

Call ERC-20 Token Contract

# USDC contract on Sepolia
contract_address = "0x7c851C38F6D4c5c6c6C5E2e3e5f5e5e5e5e5e5e5"
contract_abi = [...]

contract = w3.eth.contract(address=contract_address, abi=contract_abi)

# Read balance
balance = contract.functions.balanceOf(account.address).call()
print(f"Token balance: {balance}")

DeFi Integration Example

Interact with Uniswap

# Swap ETH to USDC using Uniswap V3
# This is a simplified example
uniswap_router = "0xE592427A0AEce92De3Edee1F18E0157C05861564"

# Approve token
token_contract.functions.approve(uniswap_router, amount).transact({'from': account.address})

# Execute swap
exactInputSingle_params = {
    'tokenIn': WETH_ADDRESS,
    'tokenOut': USDC_ADDRESS,
    'fee': 3000,
    'recipient': account.address,
    'deadline': deadline,
    'amountIn': amount_in,
    'amountOutMinimum': 0,
    'sqrtPriceLimitX96': 0
}

tx = router.functions.exactInputSingle(exactInputSingle_params).transact()

Best Practices

  • Never expose private keys - Use environment variables
  • Use testnets first - Always test on Sepolia before mainnet
  • Set appropriate gas limits - Avoid out-of-gas errors
  • Handle errors gracefully - Implement try-catch blocks
  • Use nonce management - Prevent transaction conflicts

Next Steps

  • Learn about Solidity for writing smart contracts
  • Explore DeFi protocols like Uniswap, Aave, Compound
  • Build NFT marketplaces using ERC-721
  • Integrate with The Graph for indexed data