Files
Pay2Gateway/contracts/AyrisSplitter.sol

110 lines
3.9 KiB
Solidity
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.
// 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;
}
}