78 lines
2.8 KiB
Solidity
78 lines
2.8 KiB
Solidity
/*
|
|
|
|
Copyright 2021 DODO ZOO.
|
|
SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
pragma solidity 0.6.9;
|
|
|
|
import {InitializableOwnable} from "../../lib/InitializableOwnable.sol";
|
|
import {SafeMath} from "../../lib/SafeMath.sol";
|
|
import {DecimalMath} from "../../lib/DecimalMath.sol";
|
|
|
|
interface IFee {
|
|
function getUserFee(address user,uint256 ticketAmount) external view returns (uint256);
|
|
}
|
|
|
|
interface IPrice {
|
|
function getUserPrice(address user, uint256 originalPrice, uint256 ticketAmount) external view returns (uint256);
|
|
}
|
|
|
|
contract DropsFeeModel is InitializableOwnable {
|
|
using SafeMath for uint256;
|
|
|
|
struct DropBoxInfo {
|
|
bool isSet;
|
|
uint256 globalFee;
|
|
address feeAddr;
|
|
address priceAddr;
|
|
}
|
|
|
|
mapping(address => DropBoxInfo) dropBoxes;
|
|
|
|
// ============ Event =============
|
|
event AddDropBoxInfo(address dropBox, uint256 globalFee, address feeAddr, address priceAddr);
|
|
event SetDropBoxInfo(address dropBox, uint256 globalFee, address feeAddr, address priceAddr);
|
|
|
|
|
|
function addDropBoxInfo(address dropBox, uint256 globalFee, address feeAddr, address priceAddr) external onlyOwner {
|
|
DropBoxInfo memory dropBoxInfo = DropBoxInfo({
|
|
isSet: true,
|
|
globalFee: globalFee,
|
|
feeAddr: feeAddr,
|
|
priceAddr: priceAddr
|
|
});
|
|
dropBoxes[dropBox] = dropBoxInfo;
|
|
emit AddDropBoxInfo(dropBox, globalFee, feeAddr, priceAddr);
|
|
}
|
|
|
|
function setDropBoxInfo(address dropBox, uint256 globalFee, address feeAddr, address priceAddr) external onlyOwner {
|
|
require(dropBoxes[dropBox].isSet, "NOT_FOUND_BOX");
|
|
dropBoxes[dropBox].globalFee = globalFee;
|
|
dropBoxes[dropBox].feeAddr = feeAddr;
|
|
dropBoxes[dropBox].priceAddr = priceAddr;
|
|
emit SetDropBoxInfo(dropBox, globalFee, feeAddr, priceAddr);
|
|
}
|
|
|
|
function getPayAmount(address dropBox, address user, uint256 originalPrice, uint256 ticketAmount) external view returns (uint256 payAmount, uint256 feeAmount) {
|
|
DropBoxInfo memory dropBoxInfo = dropBoxes[dropBox];
|
|
if(!dropBoxInfo.isSet) {
|
|
payAmount = originalPrice.mul(ticketAmount);
|
|
feeAmount = 0;
|
|
} else {
|
|
uint256 feeRate = dropBoxInfo.globalFee;
|
|
address feeAddr = dropBoxInfo.feeAddr;
|
|
if(feeAddr != address(0))
|
|
feeRate = IFee(feeAddr).getUserFee(user, ticketAmount);
|
|
|
|
uint256 price = originalPrice;
|
|
address priceAddr = dropBoxInfo.priceAddr;
|
|
if(priceAddr != address(0))
|
|
price = IPrice(priceAddr).getUserPrice(user, originalPrice, ticketAmount);
|
|
|
|
payAmount = price.mul(ticketAmount);
|
|
feeAmount = DecimalMath.mulFloor(payAmount, feeRate);
|
|
}
|
|
}
|
|
} |