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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
use borsh::{BorshDeserialize, BorshSerialize};
use solana_program::pubkey::Pubkey;
pub const STREAM_NAME_LEN: usize = 64;
pub const ESCROW_SEED_PREFIX: &[u8] = b"strm";
pub const CREATEPARAMS_PADDING: usize = 132;
pub const METADATA_PADDING: usize = 431;
/// The struct containing instructions for initializing a stream
#[derive(BorshDeserialize, BorshSerialize, Clone, Debug)]
#[repr(C)]
pub struct CreateParams {
/// Timestamp when the tokens start vesting
pub start_time: u64,
/// Deposited amount of tokens
pub net_amount_deposited: u64,
/// Time step (period) in seconds per which the vesting/release occurs
pub period: u64,
/// Amount released per period. Combined with `period`, we get a release rate.
pub amount_per_period: u64,
/// Vesting contract "cliff" timestamp
pub cliff: u64,
/// Amount unlocked at the "cliff" timestamp
pub cliff_amount: u64,
/// Whether or not a stream can be canceled by a sender
pub cancelable_by_sender: bool,
/// Whether or not a stream can be canceled by a recipient
pub cancelable_by_recipient: bool,
/// Whether or not a 3rd party can initiate withdraw in the name of recipient
pub automatic_withdrawal: bool,
/// Whether or not the sender can transfer the stream
pub transferable_by_sender: bool,
/// Whether or not the recipient can transfer the stream
pub transferable_by_recipient: bool,
/// Whether topup is enabled
pub can_topup: bool,
/// The name of this stream
pub stream_name: [u8; STREAM_NAME_LEN],
// Witndraw frequency
pub withdraw_frequency: u64,
}
/// The struct containing metadata for an SPL token stream
#[derive(BorshSerialize, BorshDeserialize, Clone, Debug)]
#[repr(C)]
pub struct Contract {
/// Magic bytes
pub magic: u64,
/// Version of the program
pub version: u8,
/// Timestamp when stream was created
pub created_at: u64,
/// Amount of funds withdrawn
pub amount_withdrawn: u64,
/// Timestamp when stream was canceled (if canceled)
pub canceled_at: u64,
/// Timestamp at which stream can be safely canceled by a 3rd party
/// (Stream is either fully vested or there isn't enough capital to
/// keep it active)
pub end_time: u64,
/// Timestamp of the last withdrawal
pub last_withdrawn_at: u64,
/// Pubkey of the stream initializer
pub sender: Pubkey,
/// Pubkey of the stream initializer's token account
pub sender_tokens: Pubkey,
/// Pubkey of the stream recipient
pub recipient: Pubkey,
/// Pubkey of the stream recipient's token account
pub recipient_tokens: Pubkey,
/// Pubkey of the token mint
pub mint: Pubkey,
/// Escrow account holding the locked tokens for recipient
pub escrow_tokens: Pubkey,
/// Streamflow treasury authority
pub streamflow_treasury: Pubkey,
/// Escrow account holding the locked tokens for Streamflow (fee account)
pub streamflow_treasury_tokens: Pubkey,
/// The total fee amount for streamflow
pub streamflow_fee_total: u64,
/// The withdrawn fee amount for streamflow
pub streamflow_fee_withdrawn: u64,
/// Fee percentage for Streamflow
pub streamflow_fee_percent: f32,
/// Streamflow partner authority
pub partner: Pubkey,
/// Escrow account holding the locked tokens for Streamflow partner (fee account)
pub partner_tokens: Pubkey,
/// The total fee amount for the partner
pub partner_fee_total: u64,
/// The withdrawn fee amount for the partner
pub partner_fee_withdrawn: u64,
/// Fee percentage for partner
pub partner_fee_percent: f32,
/// The stream instruction
pub ix: CreateParams,
/// Padding for `ix: CreateParams` to allow for future upgrades.
pub ix_padding: Vec<u8>,
// Stream is closed
pub closed: bool,
}
pub fn find_escrow_account(_version: u8, seed: &[u8], pid: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&[ESCROW_SEED_PREFIX, seed], pid)
}