NAC_Blockchain/nac-rwa-sharia-compliance/src/lib.rs

772 lines
32 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// NAC RWA 伊斯兰合规合约层Sharia Compliance Layer
// 版本1.0.0
//
// 覆盖辖区:
// AE阿联酋、SA沙特阿拉伯、MY马来西亚
//
// 核心原则:
// 1. 禁止利息Riba—— 任何形式的固定利息均被禁止
// 2. 禁止不确定性Gharar—— 合同条款须明确,不能有过度不确定性
// 3. 禁止赌博Maysir—— 禁止投机性交易
// 4. 禁止非法商品Haram—— 禁止猪肉、酒精、武器等非法商品
// 5. 风险共担Musharakah—— 利润和损失须共同承担
// 6. 资产支持Asset-Backed—— 金融交易须有真实资产支撑
use serde::{Deserialize, Serialize};
/// 伊斯兰金融结构类型
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum IslamicFinanceStructure {
/// Murabaha成本加成融资—— 银行购买资产后以成本加利润出售给客户
Murabaha,
/// Ijara伊斯兰租赁—— 类似融资租赁,但无利息
Ijara,
/// Ijara wa Iqtina租赁并购买—— 租赁期满后转让所有权
IjaraWaIqtina,
/// Musharakah合伙—— 双方共同出资,按比例分享利润和损失
Musharakah,
/// Mudarabah信托融资—— 一方出资,另一方经营,按约定比例分配利润
Mudarabah,
/// Sukuk伊斯兰债券—— 基于资产的证券,代表对资产的所有权份额
Sukuk,
/// Istisna制造合同—— 预先约定制造某物品的合同
Istisna,
/// Salam预付货款—— 预先付款,未来交付商品
Salam,
/// Wakalah代理—— 委托代理关系
Wakalah,
/// Takaful伊斯兰保险—— 互助保险,基于共同担保原则
Takaful,
}
/// Sharia 审查委员会要求
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShariaBoardRequirement {
/// 是否需要 Sharia 审查委员会批准
pub required: bool,
/// 最低委员人数
pub minimum_scholars: u8,
/// 是否需要 Fatwa宗教裁定
pub fatwa_required: bool,
/// 推荐的 Sharia 审查机构
pub recommended_boards: Vec<String>,
/// 持续合规监督要求
pub ongoing_monitoring: bool,
}
/// 禁止条款Haram 清单)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HaramProhibitions {
/// 禁止商品类别
pub prohibited_goods: Vec<String>,
/// 禁止行业
pub prohibited_industries: Vec<String>,
/// 禁止金融结构
pub prohibited_structures: Vec<String>,
/// 禁止合同条款
pub prohibited_clauses: Vec<String>,
}
/// Sharia 合规资产要求
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShariaAssetRequirements {
/// 资产须为真实有形资产
pub must_be_tangible: bool,
/// 资产须合法Halal
pub must_be_halal: bool,
/// 资产须可识别和确定
pub must_be_identifiable: bool,
/// 资产须已存在Salam 除外)
pub must_exist_at_contract: bool,
/// 资产须可交付
pub must_be_deliverable: bool,
/// 特殊说明
pub special_notes: Vec<String>,
}
/// 利润分配规则(替代利息)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProfitSharingRule {
/// 金融结构类型
pub structure: IslamicFinanceStructure,
/// 利润分配比例描述
pub profit_sharing_ratio: String,
/// 损失承担规则
pub loss_bearing_rule: String,
/// 基准利率替代(如 LIBOR 替代)
pub benchmark_alternative: Option<String>,
/// 说明
pub notes: String,
}
/// Sukuk伊斯兰债券结构
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SukukStructure {
/// Sukuk 类型
pub sukuk_type: IslamicFinanceStructure,
/// 基础资产描述
pub underlying_asset: String,
/// SPV特殊目的载体要求
pub spv_required: bool,
/// 资产转让要求
pub asset_transfer_required: bool,
/// 收益率计算方式(替代利息)
pub return_calculation: String,
/// 赎回机制
pub redemption_mechanism: String,
/// Sharia 审查要求
pub sharia_board: ShariaBoardRequirement,
}
/// 辖区 Sharia 合规框架
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShariaComplianceFramework {
/// 辖区代码
pub jurisdiction: String,
/// 辖区名称
pub jurisdiction_name: String,
/// 伊斯兰金融监管机构
pub regulatory_body: String,
/// 适用的伊斯兰金融法律
pub applicable_laws: Vec<String>,
/// Sharia 审查委员会要求
pub sharia_board: ShariaBoardRequirement,
/// 禁止条款
pub prohibitions: HaramProhibitions,
/// 资产要求
pub asset_requirements: ShariaAssetRequirements,
/// 支持的金融结构
pub supported_structures: Vec<IslamicFinanceStructure>,
/// 利润分配规则
pub profit_sharing_rules: Vec<ProfitSharingRule>,
/// Sukuk 发行要求(如支持)
pub sukuk_requirements: Option<SukukStructure>,
/// 不动产 Sharia 合规要求
pub real_estate_sharia_requirements: Vec<String>,
/// 商品交易 Sharia 合规要求
pub goods_trade_sharia_requirements: Vec<String>,
/// 知识产权 Sharia 合规要求
pub ip_sharia_requirements: Vec<String>,
/// 与传统金融的互操作性说明
pub conventional_interoperability: String,
}
/// 获取辖区 Sharia 合规框架
pub fn get_sharia_framework(jurisdiction: &str) -> Option<ShariaComplianceFramework> {
match jurisdiction.to_uppercase().as_str() {
"AE" => Some(ae_sharia_framework()),
"SA" => Some(sa_sharia_framework()),
"MY" => Some(my_sharia_framework()),
_ => None,
}
}
/// 验证合同是否符合 Sharia 原则
pub fn validate_sharia_compliance(
jurisdiction: &str,
structure: &IslamicFinanceStructure,
has_interest: bool,
has_excessive_uncertainty: bool,
involves_haram_goods: bool,
) -> ShariaValidationResult {
let framework = match get_sharia_framework(jurisdiction) {
Some(f) => f,
None => return ShariaValidationResult {
is_compliant: false,
violations: vec![format!("辖区 {} 不在 Sharia 合规覆盖范围内", jurisdiction)],
recommendations: vec![],
requires_fatwa: false,
},
};
let mut violations = Vec::new();
let mut recommendations = Vec::new();
if has_interest {
violations.push("违反禁止利息原则Riba合同包含固定利息条款".to_string());
recommendations.push(format!("建议将利息结构替换为 {:?} 结构", IslamicFinanceStructure::Murabaha));
}
if has_excessive_uncertainty {
violations.push("违反禁止不确定性原则Gharar合同条款存在过度不确定性".to_string());
recommendations.push("建议明确所有合同条款,消除不确定性".to_string());
}
if involves_haram_goods {
violations.push("违反禁止非法商品原则Haram交易涉及禁止商品".to_string());
recommendations.push("须确认交易商品符合 Halal 标准".to_string());
}
if !framework.supported_structures.contains(structure) {
violations.push(format!("金融结构 {:?}{} 辖区不被支持", structure, jurisdiction));
recommendations.push(format!("建议使用支持的结构:{:?}", framework.supported_structures));
}
let requires_fatwa = framework.sharia_board.fatwa_required && violations.is_empty();
ShariaValidationResult {
is_compliant: violations.is_empty(),
violations,
recommendations,
requires_fatwa,
}
}
/// Sharia 合规验证结果
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShariaValidationResult {
/// 是否合规
pub is_compliant: bool,
/// 违规项目
pub violations: Vec<String>,
/// 建议
pub recommendations: Vec<String>,
/// 是否需要 Fatwa
pub requires_fatwa: bool,
}
fn ae_sharia_framework() -> ShariaComplianceFramework {
ShariaComplianceFramework {
jurisdiction: "AE".to_string(),
jurisdiction_name: "阿联酋United Arab Emirates".to_string(),
regulatory_body: "阿联酋中央银行CBUAE+ 迪拜伊斯兰经济局DIEDC+ AAOIFI".to_string(),
applicable_laws: vec![
"联邦第6号法律2004年伊斯兰银行法".to_string(),
"联邦第14号法律2018年伊斯兰金融机构法".to_string(),
"迪拜国际金融中心DIFC伊斯兰金融规则".to_string(),
"AAOIFI Sharia Standards会计和审计组织标准".to_string(),
],
sharia_board: ShariaBoardRequirement {
required: true,
minimum_scholars: 3,
fatwa_required: true,
recommended_boards: vec![
"AAOIFI伊斯兰金融机构会计和审计组织".to_string(),
"迪拜伊斯兰银行 Sharia 委员会".to_string(),
"阿布扎比伊斯兰银行 Sharia 委员会".to_string(),
],
ongoing_monitoring: true,
},
prohibitions: HaramProhibitions {
prohibited_goods: vec![
"猪肉及猪肉制品".to_string(),
"酒精及含酒精饮料".to_string(),
"武器弹药(民用)".to_string(),
"色情内容".to_string(),
"赌博设备".to_string(),
],
prohibited_industries: vec![
"传统银行(基于利息)".to_string(),
"酒类生产和销售".to_string(),
"赌博业".to_string(),
"猪肉相关产业".to_string(),
"烟草业(部分学者认为禁止)".to_string(),
],
prohibited_structures: vec![
"固定利率贷款Riba al-Nasi'ah".to_string(),
"超额利息Riba al-Fadl".to_string(),
"期权和期货Gharar过度".to_string(),
"空头卖出(不拥有资产即出售)".to_string(),
"信用违约互换CDS".to_string(),
],
prohibited_clauses: vec![
"固定利率条款".to_string(),
"罚息条款(迟延利息)".to_string(),
"不确定价格条款".to_string(),
"条件性销售(买方须购买另一商品)".to_string(),
],
},
asset_requirements: ShariaAssetRequirements {
must_be_tangible: true,
must_be_halal: true,
must_be_identifiable: true,
must_exist_at_contract: true,
must_be_deliverable: true,
special_notes: vec![
"Sukuk 须基于真实资产,不能是纯债务".to_string(),
"Murabaha 中银行须实际拥有资产后再出售".to_string(),
"Ijara 中出租物须为合法资产".to_string(),
],
},
supported_structures: vec![
IslamicFinanceStructure::Murabaha,
IslamicFinanceStructure::Ijara,
IslamicFinanceStructure::IjaraWaIqtina,
IslamicFinanceStructure::Musharakah,
IslamicFinanceStructure::Mudarabah,
IslamicFinanceStructure::Sukuk,
IslamicFinanceStructure::Istisna,
IslamicFinanceStructure::Wakalah,
IslamicFinanceStructure::Takaful,
],
profit_sharing_rules: vec![
ProfitSharingRule {
structure: IslamicFinanceStructure::Musharakah,
profit_sharing_ratio: "按约定比例分配利润(通常与出资比例相关)".to_string(),
loss_bearing_rule: "按出资比例承担损失".to_string(),
benchmark_alternative: Some("EIBOR阿联酋银行间利率作为参考基准但不作为利息".to_string()),
notes: "利润分配比例须在合同签订时明确约定".to_string(),
},
ProfitSharingRule {
structure: IslamicFinanceStructure::Mudarabah,
profit_sharing_ratio: "出资方Rab al-Mal和经营方Mudarib按约定比例分配利润".to_string(),
loss_bearing_rule: "损失由出资方承担,经营方损失时间和劳动".to_string(),
benchmark_alternative: None,
notes: "经营方不保证利润,但须尽职经营".to_string(),
},
],
sukuk_requirements: Some(SukukStructure {
sukuk_type: IslamicFinanceStructure::Sukuk,
underlying_asset: "须为真实有形资产(不动产、基础设施、设备等)".to_string(),
spv_required: true,
asset_transfer_required: true,
return_calculation: "基于资产收益(租金、利润分成),而非固定利率".to_string(),
redemption_mechanism: "到期按约定价格赎回,或通过资产处置".to_string(),
sharia_board: ShariaBoardRequirement {
required: true,
minimum_scholars: 3,
fatwa_required: true,
recommended_boards: vec![
"AAOIFI认证的 Sharia 委员会".to_string(),
"迪拜金融服务局DFSA认可的 Sharia 顾问".to_string(),
],
ongoing_monitoring: true,
},
}),
real_estate_sharia_requirements: vec![
"不动产融资须使用 Ijara wa Iqtina租赁并购买或 Musharakah Mutanaqisah递减合伙结构".to_string(),
"禁止传统抵押贷款(含固定利息)".to_string(),
"DLD迪拜土地局须完成产权登记".to_string(),
"须获得 DLD 的 NOC无异议证明".to_string(),
"伊斯兰银行须实际拥有不动产后再转让给买方".to_string(),
"不动产须为 Halal 用途(不能用于酒吧、赌场等)".to_string(),
],
goods_trade_sharia_requirements: vec![
"商品须为 Halal合法商品".to_string(),
"商品须在合同签订时已存在Salam 除外)".to_string(),
"价格须在合同签订时明确确定".to_string(),
"禁止出售尚未拥有的商品(除 Salam 和 Istisna".to_string(),
"商品融资可使用 Murabaha 结构".to_string(),
],
ip_sharia_requirements: vec![
"知识产权可作为 Sharia 合规资产".to_string(),
"许可费须为固定金额或明确的利润分成,不能为利息".to_string(),
"可使用 Wakalah代理结构管理知识产权".to_string(),
"须确保知识产权用途符合 Halal 原则".to_string(),
],
conventional_interoperability: "阿联酋同时存在传统金融和伊斯兰金融体系DIFC 内可使用传统金融结构,但须明确标注非 Sharia 合规".to_string(),
}
}
fn sa_sharia_framework() -> ShariaComplianceFramework {
ShariaComplianceFramework {
jurisdiction: "SA".to_string(),
jurisdiction_name: "沙特阿拉伯Kingdom of Saudi Arabia".to_string(),
regulatory_body: "沙特中央银行SAMA+ 资本市场局CMA+ 沙特伊斯兰金融委员会".to_string(),
applicable_laws: vec![
"皇家法令 M/51966年银行管制法".to_string(),
"资本市场法2003年".to_string(),
"Sukuk 监管框架2021年".to_string(),
"AAOIFI Sharia Standards".to_string(),
"IFSB伊斯兰金融服务委员会标准".to_string(),
],
sharia_board: ShariaBoardRequirement {
required: true,
minimum_scholars: 3,
fatwa_required: true,
recommended_boards: vec![
"沙特阿拉伯伊斯兰大学 Sharia 委员会".to_string(),
"AAOIFI 认证学者".to_string(),
"IFSB 认可的 Sharia 顾问".to_string(),
],
ongoing_monitoring: true,
},
prohibitions: HaramProhibitions {
prohibited_goods: vec![
"猪肉及猪肉制品".to_string(),
"酒精(严格禁止)".to_string(),
"武器弹药(未经许可)".to_string(),
"色情内容".to_string(),
"赌博设备".to_string(),
"偶像崇拜相关物品".to_string(),
],
prohibited_industries: vec![
"传统银行(基于利息)".to_string(),
"酒类(严格禁止)".to_string(),
"赌博业".to_string(),
"娱乐业(部分)".to_string(),
"烟草业".to_string(),
],
prohibited_structures: vec![
"固定利率贷款".to_string(),
"任何形式的 Riba".to_string(),
"期权和期货Gharar".to_string(),
"传统保险(须用 Takaful 替代)".to_string(),
],
prohibited_clauses: vec![
"固定利率条款".to_string(),
"罚息条款".to_string(),
"不确定价格条款".to_string(),
],
},
asset_requirements: ShariaAssetRequirements {
must_be_tangible: true,
must_be_halal: true,
must_be_identifiable: true,
must_exist_at_contract: true,
must_be_deliverable: true,
special_notes: vec![
"沙特对 Sharia 合规要求极为严格,须获得正式 Fatwa".to_string(),
"Vision 2030 框架下,部分娱乐业已开放,但须确认具体项目的合规性".to_string(),
"NEOM 等新城市项目有特殊的 Sharia 合规安排".to_string(),
],
},
supported_structures: vec![
IslamicFinanceStructure::Murabaha,
IslamicFinanceStructure::Ijara,
IslamicFinanceStructure::IjaraWaIqtina,
IslamicFinanceStructure::Musharakah,
IslamicFinanceStructure::Mudarabah,
IslamicFinanceStructure::Sukuk,
IslamicFinanceStructure::Istisna,
IslamicFinanceStructure::Salam,
IslamicFinanceStructure::Wakalah,
IslamicFinanceStructure::Takaful,
],
profit_sharing_rules: vec![
ProfitSharingRule {
structure: IslamicFinanceStructure::Musharakah,
profit_sharing_ratio: "按约定比例分配利润".to_string(),
loss_bearing_rule: "按出资比例承担损失".to_string(),
benchmark_alternative: Some("SAIBOR沙特银行间利率作为参考基准".to_string()),
notes: "沙特对 Musharakah 结构有严格的 Sharia 审查要求".to_string(),
},
],
sukuk_requirements: Some(SukukStructure {
sukuk_type: IslamicFinanceStructure::Sukuk,
underlying_asset: "须为真实有形资产,沙特政府 Sukuk 通常基于基础设施资产".to_string(),
spv_required: true,
asset_transfer_required: true,
return_calculation: "基于资产收益,通常参考 SAIBOR 加点".to_string(),
redemption_mechanism: "到期按约定价格赎回".to_string(),
sharia_board: ShariaBoardRequirement {
required: true,
minimum_scholars: 3,
fatwa_required: true,
recommended_boards: vec![
"AAOIFI 认证的 Sharia 委员会".to_string(),
"沙特 CMA 认可的 Sharia 顾问".to_string(),
],
ongoing_monitoring: true,
},
}),
real_estate_sharia_requirements: vec![
"不动产融资须使用 Ijara 或 Musharakah Mutanaqisah 结构".to_string(),
"须在沙特不动产登记局Notary Public完成登记".to_string(),
"外资购买不动产受限(须获得 SAGIA 批准)".to_string(),
"不动产须为 Halal 用途".to_string(),
"须获得正式 Fatwa 确认合规性".to_string(),
],
goods_trade_sharia_requirements: vec![
"商品须为 Halal 商品(须有 Halal 认证)".to_string(),
"食品须符合沙特食品药品局SFDA的 Halal 认证".to_string(),
"商品融资可使用 Murabaha 或 Salam 结构".to_string(),
"禁止出售酒精、猪肉等 Haram 商品".to_string(),
],
ip_sharia_requirements: vec![
"知识产权须用于 Halal 目的".to_string(),
"许可费须为固定金额,不能含利息成分".to_string(),
"须获得 Sharia 委员会确认许可结构合规".to_string(),
],
conventional_interoperability: "沙特金融体系几乎完全基于伊斯兰金融,传统金融机构须设立独立的伊斯兰金融窗口".to_string(),
}
}
fn my_sharia_framework() -> ShariaComplianceFramework {
ShariaComplianceFramework {
jurisdiction: "MY".to_string(),
jurisdiction_name: "马来西亚Malaysia".to_string(),
regulatory_body: "马来西亚国家银行BNM+ 证券委员会SC+ 国家 Sharia 咨询委员会SAC".to_string(),
applicable_laws: vec![
"伊斯兰金融服务法IFSA 2013".to_string(),
"伊斯兰资本市场框架".to_string(),
"BNM Sharia 标准".to_string(),
"SC 伊斯兰证券指南".to_string(),
"AAOIFI Sharia Standards参考".to_string(),
],
sharia_board: ShariaBoardRequirement {
required: true,
minimum_scholars: 3,
fatwa_required: false,
recommended_boards: vec![
"BNM 国家 Sharia 咨询委员会SAC".to_string(),
"SC Sharia 咨询委员会".to_string(),
"ISRA伊斯兰金融研究院".to_string(),
],
ongoing_monitoring: true,
},
prohibitions: HaramProhibitions {
prohibited_goods: vec![
"猪肉及猪肉制品".to_string(),
"酒精".to_string(),
"武器弹药(未经许可)".to_string(),
"色情内容".to_string(),
],
prohibited_industries: vec![
"传统银行(基于利息)".to_string(),
"酒类".to_string(),
"赌博业".to_string(),
"烟草业".to_string(),
],
prohibited_structures: vec![
"固定利率贷款Riba".to_string(),
"任何形式的 Riba利息均被禁止".to_string(),
"传统保险(须用 Takaful 替代)".to_string(),
"Gharar 过度的衍生品".to_string(),
],
prohibited_clauses: vec![
"固定利率条款".to_string(),
"罚息条款(但可收取 Ta'widh 实际损失补偿)".to_string(),
],
},
asset_requirements: ShariaAssetRequirements {
must_be_tangible: true,
must_be_halal: true,
must_be_identifiable: true,
must_exist_at_contract: true,
must_be_deliverable: true,
special_notes: vec![
"马来西亚是全球最成熟的伊斯兰金融市场之一".to_string(),
"BNM 允许 Ta'widh实际损失补偿替代罚息".to_string(),
"马来西亚同时存在传统金融和伊斯兰金融双轨制".to_string(),
"AIBIM伊斯兰银行协会提供行业指导".to_string(),
],
},
supported_structures: vec![
IslamicFinanceStructure::Murabaha,
IslamicFinanceStructure::Ijara,
IslamicFinanceStructure::IjaraWaIqtina,
IslamicFinanceStructure::Musharakah,
IslamicFinanceStructure::Mudarabah,
IslamicFinanceStructure::Sukuk,
IslamicFinanceStructure::Istisna,
IslamicFinanceStructure::Salam,
IslamicFinanceStructure::Wakalah,
IslamicFinanceStructure::Takaful,
],
profit_sharing_rules: vec![
ProfitSharingRule {
structure: IslamicFinanceStructure::Musharakah,
profit_sharing_ratio: "按约定比例分配利润(通常与出资比例相关)".to_string(),
loss_bearing_rule: "按出资比例承担损失".to_string(),
benchmark_alternative: Some("KLIBOR吉隆坡银行间利率作为参考基准".to_string()),
notes: "马来西亚 Musharakah 实践较为灵活".to_string(),
},
ProfitSharingRule {
structure: IslamicFinanceStructure::Mudarabah,
profit_sharing_ratio: "出资方和经营方按约定比例分配利润通常70:30或80:20".to_string(),
loss_bearing_rule: "损失由出资方承担".to_string(),
benchmark_alternative: None,
notes: "马来西亚 Mudarabah 存款广泛使用".to_string(),
},
],
sukuk_requirements: Some(SukukStructure {
sukuk_type: IslamicFinanceStructure::Sukuk,
underlying_asset: "须为真实资产,马来西亚 Sukuk 市场全球最大".to_string(),
spv_required: true,
asset_transfer_required: true,
return_calculation: "基于资产收益,通常参考 KLIBOR 加点".to_string(),
redemption_mechanism: "到期按约定价格赎回".to_string(),
sharia_board: ShariaBoardRequirement {
required: true,
minimum_scholars: 3,
fatwa_required: false,
recommended_boards: vec![
"SC Sharia 咨询委员会".to_string(),
"BNM SAC 认可的 Sharia 顾问".to_string(),
],
ongoing_monitoring: true,
},
}),
real_estate_sharia_requirements: vec![
"不动产融资可使用 Bai' Bithaman AjilBBA延期付款买卖或 Musharakah Mutanaqisah".to_string(),
"须在马来西亚土地局Pejabat Tanah完成产权登记".to_string(),
"外资购买不动产须遵守各州规定(通常须获批准)".to_string(),
"不动产须为 Halal 用途".to_string(),
],
goods_trade_sharia_requirements: vec![
"商品须为 Halal 商品(须有 JAKIM Halal 认证)".to_string(),
"商品融资可使用 Murabaha 或 Tawarruq 结构".to_string(),
"禁止出售 Haram 商品".to_string(),
],
ip_sharia_requirements: vec![
"知识产权须用于 Halal 目的".to_string(),
"许可费须为固定金额或明确的利润分成".to_string(),
"马来西亚 SC 已发布知识产权 Sukuk 指南".to_string(),
],
conventional_interoperability: "马来西亚实行双轨制金融体系,传统金融和伊斯兰金融并存,须明确标注合同类型".to_string(),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ae_framework_exists() {
let f = get_sharia_framework("AE");
assert!(f.is_some());
let f = f.unwrap();
assert_eq!(f.jurisdiction, "AE");
assert!(f.sharia_board.required);
assert!(f.sharia_board.fatwa_required);
}
#[test]
fn test_sa_framework_exists() {
let f = get_sharia_framework("SA");
assert!(f.is_some());
let f = f.unwrap();
assert_eq!(f.jurisdiction, "SA");
assert!(f.sharia_board.required);
}
#[test]
fn test_my_framework_exists() {
let f = get_sharia_framework("MY");
assert!(f.is_some());
let f = f.unwrap();
assert_eq!(f.jurisdiction, "MY");
assert!(f.sharia_board.required);
}
#[test]
fn test_unknown_jurisdiction_returns_none() {
let f = get_sharia_framework("XX");
assert!(f.is_none());
}
#[test]
fn test_all_frameworks_prohibit_riba() {
for j in &["AE", "SA", "MY"] {
let f = get_sharia_framework(j).unwrap();
assert!(
f.prohibitions.prohibited_structures.iter().any(|s| s.contains("利息") || s.contains("Riba")),
"{} 框架未明确禁止利息Riba", j
);
}
}
#[test]
fn test_all_frameworks_support_murabaha() {
for j in &["AE", "SA", "MY"] {
let f = get_sharia_framework(j).unwrap();
assert!(
f.supported_structures.contains(&IslamicFinanceStructure::Murabaha),
"{} 框架不支持 Murabaha 结构", j
);
}
}
#[test]
fn test_all_frameworks_support_sukuk() {
for j in &["AE", "SA", "MY"] {
let f = get_sharia_framework(j).unwrap();
assert!(
f.supported_structures.contains(&IslamicFinanceStructure::Sukuk),
"{} 框架不支持 Sukuk", j
);
assert!(f.sukuk_requirements.is_some(), "{} 框架缺少 Sukuk 要求", j);
}
}
#[test]
fn test_validate_compliant_musharakah() {
let result = validate_sharia_compliance(
"AE",
&IslamicFinanceStructure::Musharakah,
false,
false,
false,
);
assert!(result.is_compliant);
assert!(result.violations.is_empty());
}
#[test]
fn test_validate_riba_violation() {
let result = validate_sharia_compliance(
"AE",
&IslamicFinanceStructure::Musharakah,
true,
false,
false,
);
assert!(!result.is_compliant);
assert!(result.violations.iter().any(|v| v.contains("Riba")));
}
#[test]
fn test_validate_haram_goods_violation() {
let result = validate_sharia_compliance(
"SA",
&IslamicFinanceStructure::Murabaha,
false,
false,
true,
);
assert!(!result.is_compliant);
assert!(result.violations.iter().any(|v| v.contains("Haram")));
}
#[test]
fn test_validate_gharar_violation() {
let result = validate_sharia_compliance(
"MY",
&IslamicFinanceStructure::Murabaha,
false,
true,
false,
);
assert!(!result.is_compliant);
assert!(result.violations.iter().any(|v| v.contains("Gharar")));
}
#[test]
fn test_all_frameworks_have_real_estate_requirements() {
for j in &["AE", "SA", "MY"] {
let f = get_sharia_framework(j).unwrap();
assert!(
!f.real_estate_sharia_requirements.is_empty(),
"{} 框架缺少不动产 Sharia 要求", j
);
}
}
#[test]
fn test_all_frameworks_have_goods_requirements() {
for j in &["AE", "SA", "MY"] {
let f = get_sharia_framework(j).unwrap();
assert!(
!f.goods_trade_sharia_requirements.is_empty(),
"{} 框架缺少商品 Sharia 要求", j
);
}
}
#[test]
fn test_ae_has_sukuk_spv_requirement() {
let f = get_sharia_framework("AE").unwrap();
let sukuk = f.sukuk_requirements.unwrap();
assert!(sukuk.spv_required);
assert!(sukuk.asset_transfer_required);
}
#[test]
fn test_my_dual_system_note() {
let f = get_sharia_framework("MY").unwrap();
// 马来西亚是双轨制,须有互操作性说明
assert!(f.conventional_interoperability.contains("双轨制"));
}
}