redeemer/
account_validators.rs

1use crate::*;
2
3use vipers::validate::Validate;
4use vipers::{assert_keys_eq, invariant};
5
6impl<'info> Validate<'info> for CreateRedeemer<'info> {
7    fn validate(&self) -> Result<()> {
8        self.tokens.validate()?;
9
10        assert_keys_eq!(self.tokens.redemption_vault.owner, self.redeemer);
11        assert_keys_eq!(
12            self.tokens.redemption_vault.mint,
13            self.tokens.redemption_mint
14        );
15        invariant!(self.tokens.redemption_vault.delegate.is_none());
16        invariant!(self.tokens.redemption_vault.close_authority.is_none());
17
18        Ok(())
19    }
20}
21
22impl<'info> Validate<'info> for RedeemTokens<'info> {
23    fn validate(&self) -> Result<()> {
24        self.tokens.validate()?;
25        self.tokens.validate_token_accounts(&self.redeemer)?;
26
27        assert_keys_eq!(
28            self.iou_source.mint,
29            self.redeemer.iou_mint,
30            "iou_source.mint"
31        );
32
33        require!(self.source_authority.is_signer, Unauthorized);
34        assert_keys_eq!(
35            self.source_authority,
36            self.redemption_destination.owner,
37            "redemption_destination.owner"
38        );
39
40        Ok(())
41    }
42}
43
44impl<'info> Validate<'info> for RedeemTokensFromMintProxy<'info> {
45    fn validate(&self) -> Result<()> {
46        self.redeem_ctx.validate()?;
47
48        assert_keys_eq!(
49            self.minter_info.minter,
50            self.redeem_ctx.redeemer,
51            "minter_info.minter"
52        );
53        assert_keys_eq!(
54            self.mint_proxy_state.token_mint,
55            self.redeem_ctx.redeemer.redemption_mint,
56            "redemption_mint"
57        );
58
59        assert_keys_eq!(
60            self.proxy_mint_authority,
61            self.mint_proxy_state.proxy_mint_authority,
62            "proxy_mint_authority"
63        );
64
65        Ok(())
66    }
67}
68
69impl<'info> Validate<'info> for ReadonlyTokenPair<'info> {
70    fn validate(&self) -> Result<()> {
71        require!(
72            self.iou_mint.decimals == self.redemption_mint.decimals,
73            DecimalsMismatch
74        );
75        assert_keys_eq!(self.redemption_vault.mint, self.redemption_mint);
76
77        Ok(())
78    }
79}
80
81impl<'info> Validate<'info> for MutTokenPair<'info> {
82    fn validate(&self) -> Result<()> {
83        assert_keys_eq!(self.redemption_vault.mint, self.redemption_mint);
84
85        Ok(())
86    }
87}