// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @title AyrisSplitter * @dev Otomatik ve Dinamik ödeme dağıtıcı sözleşmesi. * Her merchant için özel komisyon oranlarını destekler. */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } contract AyrisSplitter { address public owner; address public platformAddress; // Varsayılan komisyon: %1 (100/10000) uint256 public defaultFeeBps = 100; uint256 public constant BPS_DENOMINATOR = 10000; // Firmaya özel komisyon oranları (BPS cinsinden: %1 = 100) mapping(address => uint256) public merchantFees; event PaymentProcessed(address indexed merchant, address token, uint256 totalAmount, uint256 platformShare, uint256 merchantShare); event FeeUpdated(address indexed merchant, uint256 newFeeBps); event DefaultFeeUpdated(uint256 newDefaultFeeBps); modifier onlyOwner() { require(msg.sender == owner, "Yetkisiz islem: Sadece owner"); _; } constructor(address _platformAddress) { require(_platformAddress != address(0), "Gecersiz platform adresi"); owner = msg.sender; platformAddress = _platformAddress; } /** * @dev Bir merchant için özel komisyon oranını ayarlar. * Örn: %2 için _feeBps = 200 gönderilmeli. */ function setMerchantFee(address merchant, uint256 _feeBps) external onlyOwner { require(_feeBps <= BPS_DENOMINATOR, "Gecersiz oran"); merchantFees[merchant] = _feeBps; emit FeeUpdated(merchant, _feeBps); } /** * @dev Varsayılan sistem komisyonunu günceller. */ function setDefaultFee(uint256 _feeBps) external onlyOwner { require(_feeBps <= BPS_DENOMINATOR, "Gecersiz oran"); defaultFeeBps = _feeBps; emit DefaultFeeUpdated(_feeBps); } function getMerchantFee(address merchant) public view returns (uint256) { uint256 fee = merchantFees[merchant]; return fee > 0 ? fee : defaultFeeBps; } /** * @dev Native coin (ETH, MATIC, BNB) ödemesini bölüştürür. */ function payNative(address merchant) external payable { require(msg.value > 0, "Tutar 0 olamaz"); require(merchant != address(0), "Gecersiz merchant adresi"); uint256 feeBps = getMerchantFee(merchant); uint256 platformShare = (msg.value * feeBps) / BPS_DENOMINATOR; uint256 merchantShare = msg.value - platformShare; payable(platformAddress).transfer(platformShare); payable(merchant).transfer(merchantShare); emit PaymentProcessed(merchant, address(0), msg.value, platformShare, merchantShare); } /** * @dev ERC20 ödemesini (USDT, USDC vb.) bölüştürür. */ function payToken(address tokenAddress, uint256 amount, address merchant) external { require(amount > 0, "Tutar 0 olamaz"); require(merchant != address(0), "Gecersiz merchant adresi"); uint256 feeBps = getMerchantFee(merchant); uint256 platformShare = (amount * feeBps) / BPS_DENOMINATOR; uint256 merchantShare = amount - platformShare; IERC20 token = IERC20(tokenAddress); require(token.transferFrom(msg.sender, address(this), amount), "Transfer basarisiz"); require(token.transfer(platformAddress, platformShare), "Platform payi iletilemedi"); require(token.transfer(merchant, merchantShare), "Merchant payi iletilemedi"); emit PaymentProcessed(merchant, tokenAddress, amount, platformShare, merchantShare); } /** * @dev Platform cüzdan adresini günceller. */ function setPlatformAddress(address _newPlatformAddress) external onlyOwner { require(_newPlatformAddress != address(0), "Gecersiz adres"); platformAddress = _newPlatformAddress; } }