light_token_interface/state/extensions/
transfer_fee.rs

1use light_zero_copy::{ZeroCopy, ZeroCopyMut};
2
3use crate::{AnchorDeserialize, AnchorSerialize, TokenError};
4
5/// Transfer fee extension for Token accounts.
6/// Stores withheld fees that accumulate during transfers.
7/// Mirrors SPL Token-2022's TransferFeeAmount extension.
8#[derive(
9    Debug,
10    Clone,
11    Copy,
12    Hash,
13    PartialEq,
14    Eq,
15    Default,
16    AnchorSerialize,
17    AnchorDeserialize,
18    ZeroCopy,
19    ZeroCopyMut,
20)]
21#[repr(C)]
22pub struct TransferFeeAccountExtension {
23    /// Amount withheld during transfers, to be harvested on decompress
24    pub withheld_amount: u64,
25}
26
27impl<'a> ZTransferFeeAccountExtensionMut<'a> {
28    /// Add fee to withheld amount (used during transfers).
29    /// Returns error if addition would overflow.
30    pub fn add_withheld_amount(&mut self, fee: u64) -> Result<(), TokenError> {
31        let current: u64 = self.withheld_amount.get();
32        let new_amount = current
33            .checked_add(fee)
34            .ok_or(TokenError::ArithmeticOverflow)?;
35        self.withheld_amount.set(new_amount);
36        Ok(())
37    }
38}