1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use std::{str::FromStr, sync::Arc};

use anchor_client::ClientError;
use solana_client_helpers::Client;
use solana_sdk::{
    clock::{Clock, Epoch, Slot, UnixTimestamp},
    pubkey::Pubkey,
};

pub fn blocktime(client: &Arc<Client>) -> Result<i64, ClientError> {
    let clock = fetch_clock_sysvar(client).unwrap();
    Ok(clock.unix_timestamp)
}

fn fetch_clock_sysvar(client: &Arc<Client>) -> Result<Clock, ClientError> {
    let clock_addr = Pubkey::from_str("SysvarC1ock11111111111111111111111111111111").unwrap();
    let data = client.get_account_data(&clock_addr)?;
    Ok(get_clock_from_data(data))
}

fn get_clock_from_data(data: Vec<u8>) -> Clock {
    Clock {
        slot: Slot::from_le_bytes(data.as_slice()[0..8].try_into().unwrap()),
        epoch_start_timestamp: UnixTimestamp::from_le_bytes(
            data.as_slice()[8..16].try_into().unwrap(),
        ),
        epoch: Epoch::from_le_bytes(data.as_slice()[16..24].try_into().unwrap()),
        leader_schedule_epoch: Epoch::from_le_bytes(data.as_slice()[24..32].try_into().unwrap()),
        unix_timestamp: UnixTimestamp::from_le_bytes(data.as_slice()[32..40].try_into().unwrap()),
    }
}