Skip to content

Commit 4d4a747

Browse files
upd fetch-accounts
1 parent 4446aad commit 4d4a747

File tree

5 files changed

+250
-67
lines changed

5 files changed

+250
-67
lines changed

cli/test_bin/lut.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"account":{"data":["AQAAAP//////////VCmKFQAAAAAjAQFfKLpxtXVJdt0K8yLckTFEIuQhmYfmVBFu2pUHcB7pAADmyRiwvXzPkVREinq/ao85eCmh6P0Ip/DQs6q4eFL8MganVfghOQVNRCSxWvDEMM8vS3+YeTraElLUjzZmxsvOHuvEjPsyZLvDS/XFpag0/GdQAG8phtlvI1vIh1703UQLvA/Au0fKL3TEES6UqxPPo8Y05dwX6ssDzRojzX54fPuzKHUQXK6FtbREdgftv+FFJ7+0I5EcpAQjv9FSeiZ1CSw27CL1F4MA/bRKqmr/z/Ckbhy8ZBwOPtCdoTue9QgNAckoq0XTZVlaNOh3F/uwAIoZ0i8FLJ2h+YjEfFfeOguzCf2uDjrUg+kHQ7Tbp9KFUZWBkiLHcl2rauSSjP1VCKbpdecSJePoAVrHCv9ueLC92ILkkip+g4YPN4HoZU8IqnLs6kC6LnFYzDAA3P4bI+a9VH85QjlqZUSm8DujjAkVo1cjeU6Ptl0HW2tyaZw43QLllIt1sOWgQY6Al1tEBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkBXyi6cbV1SXbdCvMi3JExRCLkIZmH5lQRbtqVB3Ae6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt324e51j94YQl285GzN2rYa/E2DuQ0n/r35KNihi/wNAckoq0XTZVlaNOh3F/uwAIoZ0i8FLJ2h+YjEfFfeOguzCf2uDjrUg+kHQ7Tbp9KFUZWBkiLHcl2rauSSjP1VDQHJSTjmAlqoRvR63cIxy1VM6ev50lx9reTflsEae74Lswoa1RVJ0Mu8LffQ6X1uPzdaf1F4vE9YrAOb/3cFlg0ByVALKmF5+LZAuuTourIKXBRnlL+ueKqjmO2NT1YiC7MKL1NY6ztCiuxrOujiAu6LiQSD7ayhhKZ8zgIv+NoNAcl29p0oXdXdmJAZucjHinlDm0UdLZpmjkYlR7pjWAuzCj+l+30neNOGxmwvUYcBH5BcgmYI9bQ1G93CnQlFDQHJjHsR9+0RfSd6DupgTsrnyeMV7FkYPMUi9B72m0ELswpaaVYQ3FdNhY1zYZ6pCnZacHb3QkTqquAA790JMg0ByaKlHaua0II3lex12tecwzKR80ACCNv3pH4Uyo+nC7MKd57DjFifOFFdPZW8pdEs/3900yXEUGr46QcKMK8NAcm2aClU5SxQxOIA5pDWNyFEzGgedDouKX5Q/jSz2wuzCo8pqKAANMsHa1t957TmV6lEy1bPZfPPgZLRjHVsDQHJxMBQw9Ct1uCfVyi+5wxWd0O75gXvV0AhZ3pGjX4LswqjxSORQaRTjRJlkOMKDsJ0yZAyJlqje0FDEap/gg0BydoNu62NBXntAkJwqhoi8SO5svaEsnL1rvZDx6HSC7MKrILMRdfDTRC6TFZYXXbWukd/yxes5+TD3Rr5FDUNAcn7Dl44tSSTIed69Ah/g/iwTX7zFHBaoQ5CON87uguzCs6Ej4Y5TeYX2JLbRYORxgDKe+RqLb3KTQFD6xl9BqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAACMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WQ==","base64"],"executable":false,"lamports":9521280,"owner":"AddressLookupTab1e1111111111111111111111111","rentEpoch":18446744073709551615,"space":1240},"pubkey":"9NYFyEqPkyXUhkerbGHXUXkvb4qpzeEdHuGpgbgpH1NJ"}

fetch-accounts/README.md

Lines changed: 69 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# Account Fetcher Scripts
22

3-
Two standalone Rust scripts to fetch Solana accounts and save them as JSON files.
3+
Two standalone Rust scripts to fetch Solana accounts and save them as JSON files, with special support for Address Lookup Tables.
44

55
## Building
66

77
```bash
8-
cd fetch_accounts
8+
cd fetch-accounts
99
cargo build --release
1010
```
1111

@@ -19,40 +19,82 @@ This script uses the Light Protocol test environment to fetch accounts from test
1919
cargo run --bin fetch_test
2020
```
2121

22-
Or after building:
22+
### 2. RPC Fetcher (`fetch_rpc`) - **Recommended**
23+
24+
Fetch specific accounts from any Solana network:
2325

2426
```bash
25-
./target/release/fetch_test
26-
```
27+
# Fetch from mainnet
28+
NETWORK=mainnet cargo run --bin fetch_rpc <pubkey1> <pubkey2> ...
29+
30+
# Fetch from devnet
31+
NETWORK=devnet cargo run --bin fetch_rpc <pubkey1> <pubkey2> ...
32+
33+
# Fetch from local validator
34+
cargo run --bin fetch_rpc <pubkey1> <pubkey2> ...
2735

28-
This will:
36+
# Use custom RPC endpoint
37+
RPC_URL=https://your-rpc.com cargo run --bin fetch_rpc <pubkey1> <pubkey2> ...
38+
```
2939

30-
- Initialize a test environment
31-
- Get all state tree infos
32-
- Fetch accounts from the first two trees' cpi_context addresses
33-
- Save them as JSON files in the current directory
40+
#### Network Options
3441

35-
### 2. RPC Fetcher (`fetch_rpc`)
42+
- `NETWORK=mainnet` - Solana Mainnet Beta
43+
- `NETWORK=devnet` - Solana Devnet
44+
- `NETWORK=testnet` - Solana Testnet
45+
- `NETWORK=local` - Local validator (default)
46+
- `RPC_URL=<url>` - Custom RPC endpoint
3647

37-
This script fetches accounts from a live Solana RPC endpoint:
48+
#### Regular Account Examples
3849

3950
```bash
40-
# Using default localhost:8899
41-
cargo run --bin fetch_rpc <address1> <address2> ...
51+
# Fetch System Program and Token Program from mainnet
52+
NETWORK=mainnet cargo run --bin fetch_rpc \
53+
11111111111111111111111111111111 \
54+
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
4255

43-
# Using custom RPC endpoint
44-
RPC_URL=https://api.mainnet-beta.solana.com cargo run --bin fetch_rpc <address1> <address2> ...
56+
# Fetch a specific account from devnet
57+
NETWORK=devnet cargo run --bin fetch_rpc So11111111111111111111111111111111111111112
4558
```
4659

47-
Example:
60+
### 3. Address Lookup Table Processing
61+
62+
Set `IS_LUT=true` to decode, modify, and re-encode Address Lookup Tables:
4863

4964
```bash
50-
cargo run --bin fetch_rpc 11111111111111111111111111111111 TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
65+
# Process a lookup table from mainnet (sets last_extended_slot to 0)
66+
IS_LUT=true NETWORK=mainnet cargo run --bin fetch_rpc <lut_pubkey>
67+
68+
# Process multiple lookup tables
69+
IS_LUT=true NETWORK=mainnet cargo run --bin fetch_rpc <lut1> <lut2> <lut3>
70+
71+
# Use with custom RPC
72+
IS_LUT=true RPC_URL=https://api.mainnet-beta.solana.com cargo run --bin fetch_rpc <lut_pubkey>
5173
```
5274

75+
#### What LUT Processing Does
76+
77+
When `IS_LUT=true` is set, the script will:
78+
79+
1. **Fetch** the Address Lookup Table account data
80+
2. **Decode** the binary structure according to Solana's LUT format
81+
3. **Analyze** and display LUT metadata:
82+
- Discriminator (should be 1)
83+
- Deactivation slot
84+
- Current last_extended_slot value
85+
- Authority (if any)
86+
- Number of stored addresses
87+
4. **Modify** the `last_extended_slot` field to `0`
88+
5. **Re-encode** the data in the same binary format
89+
6. **Save** as `modified_lut_<pubkey>.json` with base64-encoded modified data
90+
91+
This is useful for testing scenarios where you need a lookup table with `last_extended_slot = 0`.
92+
5393
## Output Format
5494

55-
Both scripts save accounts in the following JSON format:
95+
### Regular Accounts
96+
97+
Saved as `account_<pubkey>.json`:
5698

5799
```json
58100
{
@@ -68,8 +110,14 @@ Both scripts save accounts in the following JSON format:
68110
}
69111
```
70112

113+
### Modified Lookup Tables
114+
115+
Saved as `modified_lut_<pubkey>.json` with the same structure but modified binary data.
116+
71117
## Notes
72118

73-
- The test fetcher (`fetch_test`) requires the Light Protocol development environment
74-
- The RPC fetcher (`fetch_rpc`) can connect to any Solana RPC endpoint
119+
- The RPC fetcher is the recommended tool for most use cases
75120
- JSON files are saved in the current working directory
121+
- Invalid pubkeys will show an error but won't stop the process
122+
- LUT processing requires the account to be a valid Address Lookup Table
123+
- The binary modification preserves all data except `last_extended_slot`
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"account":{"data":["AQAAAP//////////AAAAAAAAAAAjAQFfKLpxtXVJdt0K8yLckTFEIuQhmYfmVBFu2pUHcB7pAADmyRiwvXzPkVREinq/ao85eCmh6P0Ip/DQs6q4eFL8MganVfghOQVNRCSxWvDEMM8vS3+YeTraElLUjzZmxsvOHuvEjPsyZLvDS/XFpag0/GdQAG8phtlvI1vIh1703UQLvA/Au0fKL3TEES6UqxPPo8Y05dwX6ssDzRojzX54fPuzKHUQXK6FtbREdgftv+FFJ7+0I5EcpAQjv9FSeiZ1CSw27CL1F4MA/bRKqmr/z/Ckbhy8ZBwOPtCdoTue9QgNAckoq0XTZVlaNOh3F/uwAIoZ0i8FLJ2h+YjEfFfeOguzCf2uDjrUg+kHQ7Tbp9KFUZWBkiLHcl2rauSSjP1VCKbpdecSJePoAVrHCv9ueLC92ILkkip+g4YPN4HoZU8IqnLs6kC6LnFYzDAA3P4bI+a9VH85QjlqZUSm8DujjAkVo1cjeU6Ptl0HW2tyaZw43QLllIt1sOWgQY6Al1tEBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkBXyi6cbV1SXbdCvMi3JExRCLkIZmH5lQRbtqVB3Ae6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt324e51j94YQl285GzN2rYa/E2DuQ0n/r35KNihi/wNAckoq0XTZVlaNOh3F/uwAIoZ0i8FLJ2h+YjEfFfeOguzCf2uDjrUg+kHQ7Tbp9KFUZWBkiLHcl2rauSSjP1VDQHJSTjmAlqoRvR63cIxy1VM6ev50lx9reTflsEae74Lswoa1RVJ0Mu8LffQ6X1uPzdaf1F4vE9YrAOb/3cFlg0ByVALKmF5+LZAuuTourIKXBRnlL+ueKqjmO2NT1YiC7MKL1NY6ztCiuxrOujiAu6LiQSD7ayhhKZ8zgIv+NoNAcl29p0oXdXdmJAZucjHinlDm0UdLZpmjkYlR7pjWAuzCj+l+30neNOGxmwvUYcBH5BcgmYI9bQ1G93CnQlFDQHJjHsR9+0RfSd6DupgTsrnyeMV7FkYPMUi9B72m0ELswpaaVYQ3FdNhY1zYZ6pCnZacHb3QkTqquAA790JMg0ByaKlHaua0II3lex12tecwzKR80ACCNv3pH4Uyo+nC7MKd57DjFifOFFdPZW8pdEs/3900yXEUGr46QcKMK8NAcm2aClU5SxQxOIA5pDWNyFEzGgedDouKX5Q/jSz2wuzCo8pqKAANMsHa1t957TmV6lEy1bPZfPPgZLRjHVsDQHJxMBQw9Ct1uCfVyi+5wxWd0O75gXvV0AhZ3pGjX4LswqjxSORQaRTjRJlkOMKDsJ0yZAyJlqje0FDEap/gg0BydoNu62NBXntAkJwqhoi8SO5svaEsnL1rvZDx6HSC7MKrILMRdfDTRC6TFZYXXbWukd/yxes5+TD3Rr5FDUNAcn7Dl44tSSTIed69Ah/g/iwTX7zFHBaoQ5CON87uguzCs6Ej4Y5TeYX2JLbRYORxgDKe+RqLb3KTQFD6xl9BqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAACMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WQ==","base64"],"executable":false,"lamports":9521280,"owner":"AddressLookupTab1e1111111111111111111111111","rentEpoch":18446744073709551615,"space":1240},"pubkey":"9NYFyEqPkyXUhkerbGHXUXkvb4qpzeEdHuGpgbgpH1NJ"}

fetch-accounts/src/main_rpc.rs

Lines changed: 170 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,70 +7,202 @@ use std::io::Write;
77
use std::str::FromStr;
88

99
fn main() -> Result<(), Box<dyn std::error::Error>> {
10-
// Configure these based on your needs
11-
let rpc_url = std::env::var("RPC_URL").unwrap_or_else(|_| "http://localhost:8899".to_string());
10+
let args: Vec<String> = std::env::args().collect();
1211

13-
// Replace these with actual addresses you want to fetch
14-
// You can pass them as command line arguments or environment variables
15-
let addresses: Vec<&str> = vec![
16-
// Add your addresses here, e.g.:
17-
// "11111111111111111111111111111111",
18-
// "22222222222222222222222222222222",
19-
];
20-
21-
if addresses.is_empty() {
22-
println!("Please add addresses to fetch in the source code or pass them as arguments");
23-
println!("Usage: cargo run --bin fetch_rpc <address1> <address2> ...");
24-
25-
// Check for command line arguments
26-
let args: Vec<String> = std::env::args().collect();
27-
if args.len() > 1 {
28-
fetch_accounts_from_args(&rpc_url, &args[1..])?;
29-
}
12+
if args.len() < 2 {
13+
print_usage();
3014
return Ok(());
3115
}
3216

33-
let client = RpcClient::new(rpc_url.clone());
34-
println!("Connected to RPC: {}", rpc_url);
17+
// Get RPC URL - can be set via environment variable or use predefined networks
18+
let rpc_url = get_rpc_url();
19+
println!("Using RPC: {}", rpc_url);
20+
21+
let client = RpcClient::new(rpc_url);
22+
23+
// Check if we should process as lookup tables
24+
let is_lut = std::env::var("IS_LUT").unwrap_or_default() == "true";
3525

36-
for address_str in addresses {
37-
fetch_and_save_account(&client, address_str)?;
26+
// Fetch all addresses provided as command line arguments
27+
for address_str in &args[1..] {
28+
if is_lut {
29+
fetch_and_process_lut(&client, address_str)?;
30+
} else {
31+
fetch_and_save_account(&client, address_str)?;
32+
}
3833
}
3934

35+
println!("✅ Finished processing {} accounts", args.len() - 1);
4036
Ok(())
4137
}
4238

43-
fn fetch_accounts_from_args(rpc_url: &str, addresses: &[String]) -> Result<(), Box<dyn std::error::Error>> {
44-
let client = RpcClient::new(rpc_url.to_string());
45-
println!("Connected to RPC: {}", rpc_url);
39+
fn get_rpc_url() -> String {
40+
// Check for custom RPC_URL environment variable first
41+
if let Ok(custom_url) = std::env::var("RPC_URL") {
42+
return custom_url;
43+
}
44+
45+
// Check for NETWORK environment variable for predefined networks
46+
match std::env::var("NETWORK").as_deref() {
47+
Ok("mainnet") => "https://api.mainnet-beta.solana.com".to_string(),
48+
Ok("devnet") => "https://api.devnet.solana.com".to_string(),
49+
Ok("testnet") => "https://api.testnet.solana.com".to_string(),
50+
Ok("localnet") | Ok("local") => "http://localhost:8899".to_string(),
51+
_ => "http://localhost:8899".to_string(), // default to localnet
52+
}
53+
}
54+
55+
fn print_usage() {
56+
println!("Account Fetcher - Fetch Solana accounts and save as JSON");
57+
println!();
58+
println!("USAGE:");
59+
println!(" cargo run --bin fetch_rpc <pubkey1> <pubkey2> ...");
60+
println!();
61+
println!("NETWORKS:");
62+
println!(" Set NETWORK environment variable:");
63+
println!(" NETWORK=mainnet - Solana Mainnet");
64+
println!(" NETWORK=devnet - Solana Devnet");
65+
println!(" NETWORK=testnet - Solana Testnet");
66+
println!(" NETWORK=local - Local validator (default)");
67+
println!();
68+
println!(" Or set custom RPC_URL:");
69+
println!(" RPC_URL=https://your-custom-rpc.com");
70+
println!();
71+
println!("LOOKUP TABLE MODE:");
72+
println!(" Set IS_LUT=true to decode/modify lookup tables:");
73+
println!(" IS_LUT=true NETWORK=mainnet cargo run --bin fetch_rpc <lut_pubkey>");
74+
println!();
75+
println!("EXAMPLES:");
76+
println!(" # Fetch from mainnet");
77+
println!(" NETWORK=mainnet cargo run --bin fetch_rpc 11111111111111111111111111111111");
78+
println!();
79+
println!(" # Fetch multiple accounts from devnet");
80+
println!(" NETWORK=devnet cargo run --bin fetch_rpc \\");
81+
println!(" 11111111111111111111111111111111 \\");
82+
println!(" TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
83+
println!();
84+
println!(" # Process lookup table");
85+
println!(" IS_LUT=true NETWORK=mainnet cargo run --bin fetch_rpc <lut_pubkey>");
86+
}
87+
88+
fn fetch_and_process_lut(client: &RpcClient, address_str: &str) -> Result<(), Box<dyn std::error::Error>> {
89+
let pubkey = Pubkey::from_str(address_str)?;
90+
println!("📥 Fetching lookup table: {}", pubkey);
4691

47-
for address_str in addresses {
48-
fetch_and_save_account(&client, address_str)?;
92+
match client.get_account(&pubkey) {
93+
Ok(account) => {
94+
println!("✅ Fetched LUT: {} bytes", account.data.len());
95+
96+
// Decode the lookup table
97+
let modified_data = decode_and_modify_lut(&account.data)?;
98+
99+
let filename = format!("modified_lut_{}.json", pubkey);
100+
101+
// Create JSON with modified data
102+
let data_base64 = encode(&modified_data);
103+
let json_obj = json!({
104+
"pubkey": pubkey.to_string(),
105+
"account": {
106+
"lamports": account.lamports,
107+
"data": [data_base64, "base64"],
108+
"owner": account.owner.to_string(),
109+
"executable": account.executable,
110+
"rentEpoch": account.rent_epoch,
111+
"space": modified_data.len(),
112+
}
113+
});
114+
115+
let mut file = File::create(&filename)?;
116+
file.write_all(json_obj.to_string().as_bytes())?;
117+
118+
println!("✅ Modified LUT saved: {} (last_extended_slot set to 0)", filename);
119+
}
120+
Err(e) => {
121+
println!("❌ Error fetching LUT {}: {}", pubkey, e);
122+
}
49123
}
50124

51125
Ok(())
52126
}
53127

128+
fn decode_and_modify_lut(data: &[u8]) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
129+
if data.len() < 56 {
130+
return Err("LUT data too small".into());
131+
}
132+
133+
let mut modified_data = data.to_vec();
134+
135+
// Based on Solana's AddressLookupTable structure:
136+
// - discriminator: u32 (4 bytes) - should be 1 for LookupTable
137+
// - deactivation_slot: u64 (8 bytes) - at offset 4
138+
// - last_extended_slot: u64 (8 bytes) - at offset 12 *** THIS IS WHAT WE MODIFY ***
139+
// - last_extended_slot_start_index: u8 (1 byte) - at offset 20
140+
// - authority: Option<Pubkey> (33 bytes max) - at offset 21
141+
// - _padding: u16 (2 bytes)
142+
// - addresses follow...
143+
144+
// Verify this is a lookup table (discriminator should be 1)
145+
let discriminator = u32::from_le_bytes([data[0], data[1], data[2], data[3]]);
146+
if discriminator != 1 {
147+
return Err(format!("Not a lookup table account (discriminator: {})", discriminator).into());
148+
}
149+
150+
println!("📊 LUT Analysis:");
151+
152+
// Read current values for logging
153+
let deactivation_slot = u64::from_le_bytes([
154+
data[4], data[5], data[6], data[7], data[8], data[9], data[10], data[11]
155+
]);
156+
let current_last_extended_slot = u64::from_le_bytes([
157+
data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19]
158+
]);
159+
let last_extended_slot_start_index = data[20];
160+
161+
println!(" Discriminator: {}", discriminator);
162+
println!(" Deactivation slot: {}", deactivation_slot);
163+
println!(" Current last_extended_slot: {}", current_last_extended_slot);
164+
println!(" Last extended slot start index: {}", last_extended_slot_start_index);
165+
166+
// Check authority (1 byte for Some/None + potentially 32 bytes for pubkey)
167+
let has_authority = data[21] == 1;
168+
if has_authority && data.len() >= 54 {
169+
let authority_bytes = &data[22..54];
170+
let authority = Pubkey::try_from(authority_bytes)?;
171+
println!(" Authority: {}", authority);
172+
} else {
173+
println!(" Authority: None");
174+
}
175+
176+
// Modify last_extended_slot to 0 (at offset 12, 8 bytes)
177+
let zero_bytes = 0u64.to_le_bytes();
178+
modified_data[12..20].copy_from_slice(&zero_bytes);
179+
180+
println!("🔧 Modified last_extended_slot: {} -> 0", current_last_extended_slot);
181+
182+
// Calculate number of addresses
183+
let addresses_start = 56; // LOOKUP_TABLE_META_SIZE
184+
if data.len() > addresses_start {
185+
let addresses_data_len = data.len() - addresses_start;
186+
let num_addresses = addresses_data_len / 32; // Each address is 32 bytes
187+
println!(" Number of addresses: {}", num_addresses);
188+
}
189+
190+
Ok(modified_data)
191+
}
192+
54193
fn fetch_and_save_account(client: &RpcClient, address_str: &str) -> Result<(), Box<dyn std::error::Error>> {
55194
let pubkey = Pubkey::from_str(address_str)?;
56-
println!("Fetching account: {}", pubkey);
195+
println!("📥 Fetching account: {}", pubkey);
57196

58197
match client.get_account(&pubkey) {
59198
Ok(account) => {
60-
println!("Fetched account: {} bytes", account.data.len());
61-
62199
let filename = format!("account_{}.json", pubkey);
63200
write_account_json(&account, &pubkey, &filename)?;
64201

65-
println!("Saved to: {}", filename);
66-
println!(" Lamports: {}", account.lamports);
67-
println!(" Owner: {}", account.owner);
68-
println!(" Executable: {}", account.executable);
69-
println!(" Data length: {}", account.data.len());
70-
println!();
202+
println!("✅ Saved: {} ({} bytes, {} lamports)", filename, account.data.len(), account.lamports);
71203
}
72204
Err(e) => {
73-
println!("Error fetching account {}: {:?}", pubkey, e);
205+
println!("Error fetching {}: {}", pubkey, e);
74206
}
75207
}
76208

0 commit comments

Comments
 (0)