cryptopay 0.1.0

A comprehensive Rust library for BscScan API integration and payment verification on Binance Smart Chain
Documentation
# Data Retrieval Guide

CryptoPay provides direct access to the Etherscan API for retrieving raw blockchain data. This is useful for building wallets, analytics dashboards, or custom explorers.

## Core Concepts

Data retrieval is handled by the `EtherscanClient` through specific traits:
- `AccountEndpoints`: Balances and transaction history
- `TransactionEndpoints`: Individual transaction details and receipts
- `TokenEndpoints`: ERC20 token balances and transfers
- `GasEndpoints`: Gas prices and estimation

## 1. Retrieving Account Data

### Get Native Balance (ETH)

```rust
let balance = client.get_balance("0xUserAddress...").await?;

println!("Balance in Wei: {}", balance.wei());
println!("Balance in ETH: {}", balance.bnb()); // Helper returns Decimal
```

### Get Transaction History

Retrieve headers of normal transactions.

```rust
let history = client.get_transactions(
    "0xUserAddress...",
    0,          // Start Block (0 for genesis)
    99999999,   // End Block
    1,          // Page number
    100,        // Transactions per page & offset
    "desc"      // Sort order: "asc" or "desc"
).await?;

for tx in history {
    println!("Tx Hash: {}", tx.hash);
    println!("Value: {} ETH", tx.value_bnb());
    println!("From: {}, To: {}", tx.from, tx.to);
}
```

### Get Internal Transactions

Useful for detecting contract interactions and transfers not visible in standard tx list.

```rust
let internal_txs = client.get_internal_transactions(
    "0xUserAddress...",
    0, 99999999, 1, 100, "desc"
).await?;
```

## 2. Retrieving Token Data (ERC20)

### Get Token Balance

Check balance of a specific ERC20 token for an address.

```rust
let usdt_contract = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
let user = "0xUserAddress...";

let token_balance = client.get_token_balance(user, usdt_contract).await?;

println!("USDT Balance: {}", token_balance.balance); // Returns raw amount (check decimals!)
```

### Get Token Transfers

Get history of ERC20 token transfers.

```rust
let transfers = client.get_token_transfers(
    "0xUserAddress...",
    Some(usdt_contract), // Filter by contract (Optional: None for all tokens)
    0,
    99999999,
    1,
    100,
    "desc"
).await?;

for transfer in transfers {
    println!("Token: {}", transfer.token_symbol);
    println!("Amount: {}", transfer.value);
    println!("Tx: {}", transfer.hash);
}
```

## 3. Retrieving Transaction Details

### Get Transaction by Hash

Verify details of a specific transaction.

```rust
let tx = client.get_transaction("0xTxHash...").await?;

println!("Block: {}", tx.block_number);
println!("Gas Used: {}", tx.gas);
println!("Nonce: {}", tx.nonce);
```

### Get Transaction Receipt

Check status (success/fail) and logs.

```rust
let receipt = client.get_transaction_receipt("0xTxHash...").await?;

if receipt.status == "1" {
    println!("Transaction Successful");
} else {
    println!("Transaction Failed");
}
```

## 4. Retrieving Gas Data

### Get Gas Oracle

Current gas prices for different speeds.

```rust
let oracle = client.get_gas_oracle().await?;

println!("Safe Low: {} gwei", oracle.safe_gwei());
println!("Standard: {} gwei", oracle.propose_gwei());
println!("Fast: {} gwei", oracle.fast_gwei());
```

### Estimate Gas Price

Helpers to get a specific price directly.

```rust
use cryptopay::client::GasSpeed;

let fast_price = client.estimate_gas_price(GasSpeed::Fast).await?;
```

## Error Handling

All retrieval methods return `Result<T, Error>`.

```rust
match client.get_transaction("0xInvalidHash").await {
    Ok(tx) => process(tx),
    Err(Error::ApiError(msg)) => println!("Etherscan Error: {}", msg),
    Err(Error::RateLimitExceeded) => println!("Slow down!"),
    Err(e) => println!("Unknown error: {}", e),
}
```