58
programs/config/src/date_instruction.rs
Normal file
58
programs/config/src/date_instruction.rs
Normal file
@@ -0,0 +1,58 @@
|
||||
use crate::{config_instruction, ConfigState};
|
||||
///
|
||||
/// A library for creating a trusted date oracle.
|
||||
///
|
||||
use bincode::{deserialize, serialized_size};
|
||||
use chrono::{
|
||||
prelude::{Date, DateTime, TimeZone, Utc},
|
||||
serde::ts_seconds,
|
||||
};
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
use solana_sdk::{instruction::Instruction, pubkey::Pubkey};
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
|
||||
pub struct DateConfig {
|
||||
#[serde(with = "ts_seconds")]
|
||||
pub date_time: DateTime<Utc>,
|
||||
}
|
||||
|
||||
impl Default for DateConfig {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
date_time: Utc.timestamp(0, 0),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl DateConfig {
|
||||
pub fn new(date: Date<Utc>) -> Self {
|
||||
Self {
|
||||
date_time: date.and_hms(0, 0, 0),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn deserialize(input: &[u8]) -> Option<Self> {
|
||||
deserialize(input).ok()
|
||||
}
|
||||
}
|
||||
|
||||
impl ConfigState for DateConfig {
|
||||
fn max_space() -> u64 {
|
||||
serialized_size(&Self::default()).unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a date account. The date is set to the Unix epoch.
|
||||
pub fn create_account(
|
||||
payer_pubkey: &Pubkey,
|
||||
date_pubkey: &Pubkey,
|
||||
lamports: u64,
|
||||
) -> Vec<Instruction> {
|
||||
config_instruction::create_account::<DateConfig>(payer_pubkey, date_pubkey, lamports, vec![])
|
||||
}
|
||||
|
||||
/// Set the date in the date account. The account pubkey must be signed in the
|
||||
/// transaction containing this instruction.
|
||||
pub fn store(date_pubkey: &Pubkey, date: Date<Utc>) -> Instruction {
|
||||
let date_config = DateConfig::new(date);
|
||||
config_instruction::store(&date_pubkey, true, vec![], &date_config)
|
||||
}
|
@@ -1,5 +1,6 @@
|
||||
pub mod config_instruction;
|
||||
pub mod config_processor;
|
||||
pub mod date_instruction;
|
||||
|
||||
use crate::config_processor::process_instruction;
|
||||
use bincode::{deserialize, serialize, serialized_size};
|
||||
|
Reference in New Issue
Block a user