solana/programs/budget_api/src/budget_instruction.rs

67 lines
2.2 KiB
Rust
Raw Normal View History

use crate::budget_expr::BudgetExpr;
2019-03-02 13:23:22 -08:00
use crate::id;
use chrono::prelude::{DateTime, Utc};
2019-03-02 13:23:22 -08:00
use serde_derive::{Deserialize, Serialize};
2019-03-23 20:12:27 -07:00
use solana_sdk::instruction::{AccountMeta, Instruction};
2019-03-02 13:23:22 -08:00
use solana_sdk::pubkey::Pubkey;
/// A smart contract.
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
pub struct Contract {
2019-03-05 17:27:25 -08:00
/// The number of lamports allocated to the `BudgetExpr` and any transaction fees.
pub lamports: u64,
2018-11-02 19:13:33 -07:00
pub budget_expr: BudgetExpr,
}
/// An instruction to progress the smart contract.
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
pub enum BudgetInstruction {
2018-11-02 19:13:33 -07:00
/// Declare and instantiate `BudgetExpr`.
InitializeAccount(BudgetExpr),
/// Tell a payment plan acknowledge the given `DateTime` has past.
ApplyTimestamp(DateTime<Utc>),
/// Tell the budget that the `InitializeAccount` with `Signature` has been
/// signed by the containing transaction's `Pubkey`.
2018-09-18 18:45:44 -07:00
ApplySignature,
}
2019-02-28 03:48:44 -08:00
impl BudgetInstruction {
pub fn new_initialize_account(contract: &Pubkey, expr: BudgetExpr) -> Instruction {
2019-03-03 14:43:51 -08:00
let mut keys = vec![];
if let BudgetExpr::Pay(payment) = &expr {
keys.push(AccountMeta::new(payment.to, false));
2019-03-03 14:43:51 -08:00
}
keys.push(AccountMeta::new(*contract, false));
Instruction::new(id(), &BudgetInstruction::InitializeAccount(expr), keys)
2019-02-28 03:48:44 -08:00
}
pub fn new_apply_timestamp(
from: &Pubkey,
contract: &Pubkey,
to: &Pubkey,
dt: DateTime<Utc>,
) -> Instruction {
let mut account_metas = vec![
AccountMeta::new(*from, true),
AccountMeta::new(*contract, false),
];
2019-03-07 12:34:13 -08:00
if from != to {
account_metas.push(AccountMeta::new(*to, false));
2019-03-07 12:34:13 -08:00
}
Instruction::new(id(), &BudgetInstruction::ApplyTimestamp(dt), account_metas)
}
pub fn new_apply_signature(from: &Pubkey, contract: &Pubkey, to: &Pubkey) -> Instruction {
let mut account_metas = vec![
AccountMeta::new(*from, true),
AccountMeta::new(*contract, false),
];
2019-03-07 12:34:13 -08:00
if from != to {
account_metas.push(AccountMeta::new(*to, false));
2019-03-07 12:34:13 -08:00
}
Instruction::new(id(), &BudgetInstruction::ApplySignature, account_metas)
}
2019-02-28 03:48:44 -08:00
}