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