use crate::*; use near_sdk::{require, AccountId}; impl Contract { /// Validate permissions for share transfers between accounts pub fn internal_validate_transfer_permissions( &self, sender_id: &AccountId, receiver_id: &AccountId, ) { // Check blacklist first (takes precedence over all other checks) if self.vault_config.blacklist_enabled { require!( !self.internal_is_blacklisted(sender_id), "Sender account is blacklisted" ); require!( !self.internal_is_blacklisted(receiver_id), "Receiver account is blacklisted" ); } // Check whitelist requirements for private vaults if self.vault_config.is_private { require!( self.internal_is_whitelisted(sender_id), "Sender account is not whitelisted" ); require!( self.internal_is_whitelisted(receiver_id), "Receiver account is not whitelisted" ); } } /// Check if an account is whitelisted pub fn internal_is_whitelisted(&self, account_id: &AccountId) -> bool { self.state .whitelist_registry .as_ref() .map(|whitelist| whitelist.contains(account_id)) .unwrap_or(false) } /// Check if an account is blacklisted pub fn internal_is_blacklisted(&self, account_id: &AccountId) -> bool { self.state .blacklist_registry .as_ref() .map(|blacklist| blacklist.contains(account_id)) .unwrap_or(false) } /// Validate permissions for deposit operations (ft_on_transfer, mt_on_transfer) /// Checks sender, optional previous_owner, and receiver against blacklist/whitelist pub fn internal_validate_deposit_permissions( &self, sender_id: &AccountId, previous_owner_id: Option<&AccountId>, receiver_id: &AccountId, ) { // Check blacklist first (takes precedence over all other checks) if self.vault_config.blacklist_enabled { require!( !self.internal_is_blacklisted(sender_id), "Sender account is blacklisted" ); if let Some(previous_owner) = previous_owner_id { require!( !self.internal_is_blacklisted(previous_owner), "Previous owner account is blacklisted" ); } require!( !self.internal_is_blacklisted(receiver_id), "Receiver account is blacklisted" ); } // Check whitelist requirements for private vaults if self.vault_config.is_private { require!( self.internal_is_whitelisted(sender_id), "Sender account is not whitelisted" ); if let Some(previous_owner) = previous_owner_id { require!( self.internal_is_whitelisted(previous_owner), "Previous owner account is not whitelisted" ); } require!( self.internal_is_whitelisted(receiver_id), "Receiver account is not whitelisted" ); } } }