feat: implement platform treasury model with merchant balance tracking and API docs

This commit is contained in:
mstfyldz
2026-03-13 01:33:28 +03:00
parent 5d14a08490
commit 3f2e21c3d3
8 changed files with 245 additions and 108 deletions

View File

@@ -3,8 +3,8 @@ pragma solidity ^0.8.20;
/**
* @title AyrisSplitter
* @dev Otomatik ödeme dağıtıcı sözleşmesi.
* %1 Platform payını keser, %99 Merchant (Firma) adresine gönderir.
* @dev Otomatik ve Dinamik ödeme dağıtıcı sözleşmesi.
* Her merchant için özel komisyon oranlarını destekler.
*/
interface IERC20 {
@@ -13,25 +13,64 @@ interface IERC20 {
}
contract AyrisSplitter {
address public owner;
address public platformAddress;
uint256 public constant PLATFORM_FEE_BPS = 100; // %1 (100/10000)
// 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 Native coin (ETH, MATIC, BNB) ödemesini böler.
* @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 platformShare = (msg.value * PLATFORM_FEE_BPS) / BPS_DENOMINATOR;
uint256 feeBps = getMerchantFee(merchant);
uint256 platformShare = (msg.value * feeBps) / BPS_DENOMINATOR;
uint256 merchantShare = msg.value - platformShare;
payable(platformAddress).transfer(platformShare);
@@ -41,27 +80,30 @@ contract AyrisSplitter {
}
/**
* @dev ERC20/TRC20 (USDT, USDC) ödemesini böler.
* Kullanıcı önce bu sözleşmeye 'approve' vermelidir.
* @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");
IERC20 token = IERC20(tokenAddress);
uint256 platformShare = (amount * PLATFORM_FEE_BPS) / BPS_DENOMINATOR;
uint256 feeBps = getMerchantFee(merchant);
uint256 platformShare = (amount * feeBps) / BPS_DENOMINATOR;
uint256 merchantShare = amount - platformShare;
// 1. Ödemeyi müşteriden sözleşmeye çek
IERC20 token = IERC20(tokenAddress);
require(token.transferFrom(msg.sender, address(this), amount), "Transfer basarisiz");
// 2. Platform payını gönder
require(token.transfer(platformAddress, platformShare), "Platform payi iletilemedi");
// 3. Merchant payını gönder
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;
}
}