Files
dodo-contractV2/contracts/DODODrops/DODODropsV2/DropsFeeModel.sol

78 lines
2.8 KiB
Solidity
Raw Normal View History

2021-05-19 19:13:46 +08:00
/*
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);
}
2021-05-20 11:09:59 +08:00
contract DropsFeeModel is InitializableOwnable {
2021-05-19 19:13:46 +08:00
using SafeMath for uint256;
2021-05-20 11:09:59 +08:00
struct DropBoxInfo {
2021-05-19 19:13:46 +08:00
bool isSet;
uint256 globalFee;
address feeAddr;
address priceAddr;
}
2021-05-20 11:09:59 +08:00
mapping(address => DropBoxInfo) dropBoxes;
2021-05-19 19:13:46 +08:00
2021-06-01 21:38:49 +08:00
// ============ Event =============
event AddDropBoxInfo(address dropBox, uint256 globalFee, address feeAddr, address priceAddr);
event SetDropBoxInfo(address dropBox, uint256 globalFee, address feeAddr, address priceAddr);
2021-05-27 14:49:51 +08:00
function addDropBoxInfo(address dropBox, uint256 globalFee, address feeAddr, address priceAddr) external onlyOwner {
2021-05-20 11:09:59 +08:00
DropBoxInfo memory dropBoxInfo = DropBoxInfo({
2021-05-19 19:13:46 +08:00
isSet: true,
globalFee: globalFee,
feeAddr: feeAddr,
priceAddr: priceAddr
});
2021-05-20 11:09:59 +08:00
dropBoxes[dropBox] = dropBoxInfo;
2021-06-01 21:38:49 +08:00
emit AddDropBoxInfo(dropBox, globalFee, feeAddr, priceAddr);
2021-05-19 19:13:46 +08:00
}
2021-05-20 11:09:59 +08:00
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;
2021-06-01 21:38:49 +08:00
emit SetDropBoxInfo(dropBox, globalFee, feeAddr, priceAddr);
2021-05-19 19:13:46 +08:00
}
2021-05-20 11:09:59 +08:00
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) {
2021-05-19 19:13:46 +08:00
payAmount = originalPrice.mul(ticketAmount);
feeAmount = 0;
} else {
2021-05-20 11:09:59 +08:00
uint256 feeRate = dropBoxInfo.globalFee;
address feeAddr = dropBoxInfo.feeAddr;
2021-05-19 19:13:46 +08:00
if(feeAddr != address(0))
feeRate = IFee(feeAddr).getUserFee(user, ticketAmount);
uint256 price = originalPrice;
2021-05-20 11:09:59 +08:00
address priceAddr = dropBoxInfo.priceAddr;
2021-05-19 19:13:46 +08:00
if(priceAddr != address(0))
price = IPrice(priceAddr).getUserPrice(user, originalPrice, ticketAmount);
payAmount = price.mul(ticketAmount);
feeAmount = DecimalMath.mulFloor(payAmount, feeRate);
}
}
}