import json
import os
import random
import time
import httpx
def get(client, path, params=None):
for attempt in range(5):
response = client.get(path, params=params)
if response.status_code != 429 or attempt == 4:
response.raise_for_status()
return response.json()
# No Retry-After header is sent, so back off exponentially with jitter.
time.sleep(min(2 ** attempt, 30) + random.uniform(0, 1))
ADDRESS = "2kkSm4in18qXS1drfBvdpEULaiJ6k1ovXJd6T7aAzX2x"
NETWORK = "solana"
USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
with httpx.Client(
base_url="https://api.range.org",
headers={
"Authorization": f"Bearer {os.environ['RANGE_API_KEY']}",
"User-Agent": "curl/8.4.0",
"Accept": "application/json",
},
timeout=60,
) as client:
balance = get(client, "/v1/address/balance", {
"address": ADDRESS, "network": NETWORK, "network_type": "solana",
"token_contracts": USDC_MINT,
})
if balance["lookup_status"] != "ok":
raise RuntimeError(json.dumps({
"lookup_status": balance["lookup_status"], "reason": balance["reason"],
}))
lines = balance["balances"]["native_tokens"] + balance["balances"]["tokens"]
exact_balances = [{
"denom": line["denom"], "base_amount": line["base_amount"],
"decimals": line["decimals"], "amount_string": line["amount_string"],
"usd_string": line.get("usd_string"),
} for line in lines]
identity = get(client, "/v1/address", {"address": ADDRESS, "network": NETWORK})
assert identity["address"] == ADDRESS and identity["network"] == NETWORK
funding = get(client, "/v2/address/fundedBy", {
"address": ADDRESS, "network": NETWORK,
})
print(json.dumps({
"address": identity["address"], "network": identity["network"],
"lookup_status": balance["lookup_status"], "balances": exact_balances,
"label": identity.get("name_tag"), "entity": identity.get("entity"),
"entity_name": identity.get("entity_name"),
"funding_record": {
"address": funding["address"]["address"],
"address_network": funding["address"]["network"],
"network": funding["network"], "tx_hash": funding["tx_hash"],
"time": funding["time"], "amount": funding["amount"],
"token": funding["token"],
},
}, indent=2))