cronos_network/state/
node.rs

1use {
2    crate::pda::PDA,
3    anchor_lang::{prelude::*, AnchorDeserialize},
4    anchor_spl::token::TokenAccount,
5    std::convert::TryFrom,
6};
7
8pub const SEED_NODE: &[u8] = b"node";
9
10/**
11 * Node
12 */
13
14#[account]
15#[derive(Debug)]
16pub struct Node {
17    pub delegate: Pubkey, // The node's delegate address used to sign queue_exec ixs
18    pub id: u64,
19    pub owner: Pubkey, // The node's owner gossip network (controls the stake)
20    pub stake: Pubkey, // The associated token account
21}
22
23impl Node {
24    pub fn pda(delegate: Pubkey) -> PDA {
25        Pubkey::find_program_address(&[SEED_NODE, delegate.as_ref()], &crate::ID)
26    }
27}
28
29impl TryFrom<Vec<u8>> for Node {
30    type Error = Error;
31    fn try_from(data: Vec<u8>) -> std::result::Result<Self, Self::Error> {
32        Node::try_deserialize(&mut data.as_slice())
33    }
34}
35
36/**
37 * NodeAccount
38 */
39
40pub trait NodeAccount {
41    fn new(
42        &mut self,
43        delegate: &Signer,
44        id: u64,
45        owner: &mut Signer,
46        stake: &mut Account<TokenAccount>,
47    ) -> Result<()>;
48}
49
50impl NodeAccount for Account<'_, Node> {
51    fn new(
52        &mut self,
53        delegate: &Signer,
54        id: u64,
55        owner: &mut Signer,
56        stake: &mut Account<TokenAccount>,
57    ) -> Result<()> {
58        self.delegate = delegate.key();
59        self.id = id;
60        self.owner = owner.key();
61        self.stake = stake.key();
62        Ok(())
63    }
64}