/**
* 函数:payoutByContract
* 功能:该合约用于处理批量付款操作
* 限定:onlyFinancials(payoutAddress) 确保只有BlockATM授权的财务地址或代理合约可以调用此函数
* @param orderNo 批量代付订单号数组,由商户财务通过api或excel上传
* @param array 批量接收地址数组,由商户财务通过api或excel上传
* @param amount 批量支付金额数组,由商户财务通过api或excel上传
* @return bool 返回 true 表示付款成功。
**/
function payoutByContract(bool safe, address tokenAddress, uint256 total, address payoutAddress, string[] calldata orderNo, address[] calldata array, uint256[] calldata amount) public onlyFinancials(payoutAddress) returns (bool) {
// 调用内部函数 payoutToken 进行付款操作
payoutToken(safe, payoutAddress, tokenAddress, total, 0, 1, orderNo, array, amount, 0);
// 返回 true 表示支付成功
return true;
}
// 函数:payoutToken
// 功能:执行付款的流程
function payoutToken(bool safe, address from, address tokenAddress, uint256 total, uint256 gasAmount, uint256 payType, string[] calldata orderNo, address[] calldata array, uint256[] calldata amount, uint256 id) internal {
// 参数安全性检查
...
// 执行代币批量转账操作
_transferTokens(safe, from, tokenAddress, total, gasAmount, payType, feeAmount);
_processBatchPayments(safe, tokenAddress, array, amount, length);
// 执行手续费计算和扣除
super.withdrawCommon(safe, tokenAddress, IBlockFee(feeGateway).feeAddress(), feeAmount + gasAmount);
// 触发支付完成事件,用于BlockATM代付事件监听
emit PayoutToken(from, tokenAddress, payType, feeAmount, gasAmount, orderNo, array, amount, msg.sender, id);
}