A complete Python library for interacting with the XRP Ledger blockchain, providing transaction creation, account management, and comprehensive XRPL protocol support
Query ledger state information including current fees, ledger sequences, and network status. These functions provide essential ledger-level information for building XRPL applications.
Query current network fees and reserve requirements.
from xrpl import ledger
def get_fee(client, max_fee_xrp: str = None) -> str:
"""
Get current base fee and reserve amounts from the network.
Args:
client: XRPL client for network communication
max_fee_xrp: Optional maximum fee limit in XRP
Returns:
Current base fee in drops as string
Raises:
XRPLException: If fee query fails
"""Query ledger sequence numbers for timing and validation purposes.
def get_latest_open_ledger_sequence(client) -> int:
"""
Get the latest open (not yet validated) ledger sequence number.
Args:
client: XRPL client for network communication
Returns:
Latest open ledger sequence number
Raises:
XRPLException: If ledger query fails
"""
def get_latest_validated_ledger_sequence(client) -> int:
"""
Get the latest validated ledger sequence number.
Args:
client: XRPL client for network communication
Returns:
Latest validated ledger sequence number
Raises:
XRPLException: If ledger query fails
"""from xrpl.clients import JsonRpcClient
from xrpl import ledger
# Connect to XRPL network
client = JsonRpcClient("https://s.altnet.rippletest.net:51234")
# Get current base fee
try:
base_fee = ledger.get_fee(client)
print(f"Current base fee: {base_fee} drops")
# Convert to XRP for display
from xrpl.utils import drops_to_xrp
fee_xrp = drops_to_xrp(base_fee)
print(f"Base fee in XRP: {fee_xrp}")
except Exception as e:
print(f"Failed to get fee: {e}")
# Get fee with maximum limit
try:
limited_fee = ledger.get_fee(client, max_fee_xrp="0.01")
print(f"Fee with limit: {limited_fee} drops")
except Exception as e:
print(f"Failed to get limited fee: {e}")from xrpl.clients import JsonRpcClient
from xrpl import ledger
import time
def monitor_ledger_progress(client, duration: int = 60):
"""Monitor ledger sequence progression."""
print("Monitoring ledger progress...")
start_time = time.time()
while time.time() - start_time < duration:
try:
# Get current ledger info
open_seq = ledger.get_latest_open_ledger_sequence(client)
validated_seq = ledger.get_latest_validated_ledger_sequence(client)
print(f"Open: {open_seq}, Validated: {validated_seq}, Gap: {open_seq - validated_seq}")
time.sleep(5) # Check every 5 seconds
except Exception as e:
print(f"Error monitoring ledger: {e}")
time.sleep(5)
# Usage
client = JsonRpcClient("https://s.altnet.rippletest.net:51234")
monitor_ledger_progress(client, duration=30)from xrpl.clients import JsonRpcClient
from xrpl import ledger
def get_transaction_timing_info(client) -> dict:
"""Get timing information for transaction submission."""
try:
# Get current ledger sequences
open_seq = ledger.get_latest_open_ledger_sequence(client)
validated_seq = ledger.get_latest_validated_ledger_sequence(client)
# Calculate recommended LastLedgerSequence
# Typically set 3-10 ledgers ahead for safety
recommended_last_ledger = open_seq + 5
return {
"current_open": open_seq,
"current_validated": validated_seq,
"ledger_gap": open_seq - validated_seq,
"recommended_last_ledger": recommended_last_ledger,
"time_window_seconds": 5 * 4 # ~4 seconds per ledger
}
except Exception as e:
return {"error": str(e)}
# Usage
client = JsonRpcClient("https://s.altnet.rippletest.net:51234")
timing_info = get_transaction_timing_info(client)
if "error" not in timing_info:
print("Transaction Timing Info:")
print(f" Current open ledger: {timing_info['current_open']}")
print(f" Current validated ledger: {timing_info['current_validated']}")
print(f" Recommended LastLedgerSequence: {timing_info['recommended_last_ledger']}")
print(f" Estimated time window: {timing_info['time_window_seconds']} seconds")
else:
print(f"Error getting timing info: {timing_info['error']}")from xrpl.clients import JsonRpcClient
from xrpl import ledger
from xrpl.utils import xrp_to_drops
def calculate_transaction_cost(client, transaction_size_factor: float = 1.0) -> dict:
"""Calculate estimated transaction cost."""
try:
# Get base fee
base_fee_drops = int(ledger.get_fee(client))
# Account for transaction complexity
# Simple transactions use base fee, complex ones may need more
estimated_fee_drops = int(base_fee_drops * transaction_size_factor)
# Add some buffer for network congestion
recommended_fee_drops = int(estimated_fee_drops * 1.2)
return {
"base_fee_drops": base_fee_drops,
"estimated_fee_drops": estimated_fee_drops,
"recommended_fee_drops": recommended_fee_drops,
"recommended_fee_xrp": float(recommended_fee_drops / 1_000_000)
}
except Exception as e:
return {"error": str(e)}
# Usage examples
client = JsonRpcClient("https://s.altnet.rippletest.net:51234")
# Simple payment
simple_cost = calculate_transaction_cost(client, 1.0)
print("Simple transaction cost:", simple_cost)
# Complex transaction (e.g., with paths, multiple currencies)
complex_cost = calculate_transaction_cost(client, 2.0)
print("Complex transaction cost:", complex_cost)
# Multi-sign transaction
multisign_cost = calculate_transaction_cost(client, 1.5)
print("Multi-sign transaction cost:", multisign_cost)import asyncio
from xrpl.asyncio.clients import AsyncJsonRpcClient
from xrpl.asyncio import ledger
async def get_ledger_info_async(client):
"""Get comprehensive ledger information asynchronously."""
# Run multiple queries concurrently
fee_task = ledger.get_fee(client)
open_seq_task = ledger.get_latest_open_ledger_sequence(client)
validated_seq_task = ledger.get_latest_validated_ledger_sequence(client)
# Wait for all to complete
fee, open_seq, validated_seq = await asyncio.gather(
fee_task, open_seq_task, validated_seq_task
)
return {
"base_fee_drops": fee,
"open_ledger_sequence": open_seq,
"validated_ledger_sequence": validated_seq,
"ledger_gap": open_seq - validated_seq
}
async def main():
client = AsyncJsonRpcClient("https://s.altnet.rippletest.net:51234")
try:
ledger_info = await get_ledger_info_async(client)
print("Ledger Information:")
for key, value in ledger_info.items():
print(f" {key}: {value}")
finally:
await client.close()
# Run async example
asyncio.run(main())The ledger functions are commonly used with transaction operations:
from xrpl.clients import JsonRpcClient
from xrpl import ledger, transaction
from xrpl.models.transactions import Payment
from xrpl.wallet import Wallet
def create_payment_with_timing(client, wallet, destination: str, amount: str):
"""Create payment with proper timing information."""
# Get current ledger state
open_seq = ledger.get_latest_open_ledger_sequence(client)
base_fee = ledger.get_fee(client)
# Create payment with timing info
payment = Payment(
account=wallet.address,
destination=destination,
amount=amount,
fee=str(int(int(base_fee) * 1.2)), # 20% buffer on fee
last_ledger_sequence=open_seq + 5 # 5 ledger window
)
print(f"Created payment with fee: {payment.fee} drops")
print(f"LastLedgerSequence: {payment.last_ledger_sequence}")
return payment
# Usage
client = JsonRpcClient("https://s.altnet.rippletest.net:51234")
wallet = Wallet.create() # In practice, use funded wallet
payment = create_payment_with_timing(
client,
wallet,
"rReceiver...",
"1000000"
)Install with Tessl CLI
npx tessl i tessl/pypi-xrpl-py