编译器
0.8.24+commit.e11b9ed9
文件 1 的 13:AccessControl.sol
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}
文件 2 的 13:Address.sol
pragma solidity ^0.8.20;
library Address {
error AddressInsufficientBalance(address account);
error AddressEmptyCode(address target);
error FailedInnerCall();
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
function _revert(bytes memory returndata) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}
文件 3 的 13:Context.sol
pragma solidity ^0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 4 的 13:DataSalePoint.sol
pragma solidity 0.8.24;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "../interfaces/data/IDataSalePoint.sol";
contract DataSalePoint is AccessControl, ReentrancyGuard, IDataSalePoint {
using SafeERC20 for IERC20;
bytes32 public constant SALE_ROLE = keccak256("SALE_ROLE");
bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE");
bytes32 public constant RUNNER_ROLE = keccak256("RUNNER_ROLE");
address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
address internal constant TOKEN = 0xbDEBDebdeBDebdEbDebDeBDEBdEBdEbDeBdeBDeB;
uint256 internal constant MAX = 1000000000000000000000000;
uint256 internal constant MIN = 1000000000000000000;
address private _treasury;
TurnStatus private _turnStatus;
Turn[] private _turns;
uint256 private _currentTurn;
uint256 private _max;
uint256 private _min;
uint256 private _kycLimit;
mapping(address => bool) private _kyc;
uint256 private _firstRecRate = 50;
uint256 private _secondRecRate = 50;
uint256 private _totalSold;
mapping(address => uint256) private _amounts;
mapping(address => mapping(uint256 => uint256)) private _balancesByTurn;
mapping(address => Recommender) private _recommender;
mapping(address => address) private _recommendedUsers;
mapping(address => mapping(address => uint256)) private _recommenderAmounts;
bool public trustRecommender;
event TurnStatusUpdatedSuccessfully(TurnStatus turnStatus);
event TurnOpenedSuccessfully(uint256 indexed turn);
event TurnClosedSuccessfully(uint256 indexed turn);
event TurnAddedSuccessfully(uint256 sPrice, uint256 lPrice, uint256 supply);
event TurnPriceUpdatedSuccessfully(uint256 indexed turn, uint256 sPrice, uint256 lPrice);
event TurnSupplyUpdatedSuccessfully(uint256 indexed turn, uint256 supply);
event Erc20RecoveredSuccessfully(address token, uint256 amount);
event CoinRecoveredSuccessfully(uint256 amount);
event KycLimitUpdatedSuccessfully(uint256 limit);
event KycUserUpdatedSuccessfully(address indexed user, bool value);
event MaxUpdatedSuccessfully(uint256 amount);
event MinUpdatedSuccessfully(uint256 amount);
event TreasuryUpdatedSuccessfully(address indexed treasury);
event RecRateSetupSuccessfully(uint256 firstRecRate, uint256 secondRecRate);
event RecommenderSetupSuccessfully(address indexed rec, uint256 firstRecRate, uint256 secondRecRate);
event RecommenderEnabledSuccessfully(address indexed rec);
event RecommenderDisabledSuccessfully(address indexed rec);
event ClaimedFundsSuccessfully(address indexed rec, address indexed token, uint256 amount);
error ParamsInvalid();
error Started();
error Closed();
error ZeroAddress();
error TurnUndefined(uint256 index_);
error TurnStarted(uint256 index_);
error TurnClosed(uint256 index_);
error TurnSupply(uint256 index_);
error Min(uint256 amount_, uint256 min_);
error Max(uint256 amount_, uint256 max_);
error KycLimit(uint256 limit_, uint256 min_, uint256 max_);
error FirstRecFunds(uint256 reward_);
error SecondRecFunds(uint256 reward_);
error RecUndefined(address rec_);
error RecEnabled(address rec_);
error RecDisabled(address rec_);
error TokenUndefined();
error TransferNative();
constructor(address treasury_) {
if (treasury_ == address(0)) {
revert ZeroAddress();
}
_treasury = treasury_;
_grantRole(DEFAULT_ADMIN_ROLE, _msgSender());
_grantRole(SALE_ROLE, _msgSender());
_grantRole(MANAGER_ROLE, _msgSender());
_grantRole(RUNNER_ROLE, _msgSender());
}
function open() external onlyRole(DEFAULT_ADMIN_ROLE) {
if (_turnStatus != TurnStatus.None) {
revert Started();
}
_turnStatus = TurnStatus.Opened;
emit TurnStatusUpdatedSuccessfully(_turnStatus);
}
function close() external onlyRole(DEFAULT_ADMIN_ROLE) {
if (!isActive()) {
revert Closed();
}
_turnStatus = TurnStatus.Closed;
emit TurnStatusUpdatedSuccessfully(_turnStatus);
}
function setTurn(
uint256 sPrice_,
uint256 lPrice_,
uint256 supply_
) external onlyRole(MANAGER_ROLE) {
if (isInactive()) {
revert Closed();
}
_turns.push(
Turn({
defined: true,
turnStatus: TurnStatus.None,
sPrice: sPrice_,
lPrice: lPrice_,
sold: 0,
supply: supply_
})
);
emit TurnAddedSuccessfully(sPrice_, lPrice_, supply_);
}
function setRecRate(
uint256 firstRecRate_,
uint256 secondRecRate_
) external onlyRole(MANAGER_ROLE) {
if (isInactive()) {
revert Closed();
}
if (firstRecRate_ > 1000) {
revert FirstRecFunds(firstRecRate_);
}
if (secondRecRate_ > 1000) {
revert SecondRecFunds(secondRecRate_);
}
_firstRecRate = firstRecRate_;
_secondRecRate = secondRecRate_;
emit RecRateSetupSuccessfully(_firstRecRate, _secondRecRate);
}
function setupRecommenders(
address[] calldata rec_,
uint256[] calldata firstRecRate_,
uint256[] calldata secodRecFunds_
) external onlyRole(RUNNER_ROLE) {
if (isInactive()) {
revert Closed();
}
if (rec_.length != firstRecRate_.length || rec_.length != secodRecFunds_.length) {
revert ParamsInvalid();
}
for (uint256 index = 0; index < rec_.length; index++) {
_recommender[rec_[index]] = Recommender({
defined: true,
enabled: true,
firstRecRate: firstRecRate_[index],
secondRecRate: secodRecFunds_[index]
});
emit RecommenderSetupSuccessfully(rec_[index], firstRecRate_[index], secodRecFunds_[index]);
}
}
function updateTurnPrice(
uint256 index_,
uint256 sPrice_,
uint256 lPrice_
) external onlyRole(MANAGER_ROLE) {
if (isInactive()) {
revert Closed();
}
if (!_turns[index_].defined) {
revert TurnUndefined(index_);
}
if (_turns[index_].turnStatus != TurnStatus.None) {
revert TurnStarted(index_);
}
_turns[index_].sPrice = sPrice_;
_turns[index_].lPrice = lPrice_;
emit TurnPriceUpdatedSuccessfully(index_, sPrice_, lPrice_);
}
function updateTurnSupply(
uint256 index_,
uint256 supply_
) external onlyRole(MANAGER_ROLE) {
if (isInactive()) {
revert Closed();
}
if (!_turns[index_].defined) {
revert TurnUndefined(index_);
}
if (_turns[index_].turnStatus == TurnStatus.Closed) {
revert TurnClosed(index_);
}
if (_turns[index_].sold > supply_) {
revert TurnSupply(index_);
}
_turns[index_].supply = supply_;
emit TurnSupplyUpdatedSuccessfully(index_, supply_);
}
function startTurn(uint256 index_) external onlyRole(RUNNER_ROLE) {
if (!isActive()) {
revert Closed();
}
if (!_turns[index_].defined) {
revert TurnUndefined(index_);
}
if (_turns[index_].turnStatus != TurnStatus.None) {
revert TurnStarted(index_);
}
if (_turns[_currentTurn].turnStatus == TurnStatus.Opened) {
_turns[_currentTurn].turnStatus = TurnStatus.Closed;
}
_turns[index_].turnStatus = TurnStatus.Opened;
_currentTurn = index_;
emit TurnOpenedSuccessfully(index_);
}
function endTurn(uint256 index_) external onlyRole(RUNNER_ROLE) {
if (!_turns[index_].defined) {
revert TurnUndefined(index_);
}
if (_turns[index_].turnStatus != TurnStatus.Opened) {
revert TurnClosed(index_);
}
_turns[index_].turnStatus = TurnStatus.Closed;
emit TurnClosedSuccessfully(index_);
}
function setKyc(address user_, bool value_) external onlyRole(RUNNER_ROLE) {
_kyc[user_] = value_;
emit KycUserUpdatedSuccessfully(user_, value_);
}
function setKycBatch(
address[] calldata users_,
bool[] calldata values_
) external onlyRole(RUNNER_ROLE) {
if (users_.length != values_.length) {
revert ParamsInvalid();
}
for (uint256 index = 0; index < users_.length; index++) {
_kyc[users_[index]] = values_[index];
emit KycUserUpdatedSuccessfully(users_[index], values_[index]);
}
}
function setMax(uint256 amount_) external onlyRole(MANAGER_ROLE) {
if (amount_ > MAX) {
revert Max(amount_, MAX);
}
if (amount_ < _min) {
revert Min(amount_, _min);
}
_max = amount_;
emit MaxUpdatedSuccessfully(_max);
}
function setMin(uint256 amount_) external onlyRole(MANAGER_ROLE) {
if (amount_ < MIN) {
revert Min(amount_, MIN);
}
if (amount_ > _max) {
revert Max(amount_, _max);
}
_min = amount_;
emit MinUpdatedSuccessfully(_min);
}
function setKycLimit(uint256 amount_) external onlyRole(MANAGER_ROLE) {
if (_min > amount_ || amount_ > _max) {
revert KycLimit(amount_, _min, _max);
}
_kycLimit = amount_;
emit KycLimitUpdatedSuccessfully(amount_);
}
function setTreasury(address treasury_) external onlyRole(DEFAULT_ADMIN_ROLE) {
if (treasury_ == address(0)) {
revert ZeroAddress();
}
_treasury = treasury_;
emit TreasuryUpdatedSuccessfully(_treasury);
}
function setTurnStatus(
address user_,
address token_,
uint256 amount_,
uint256 sold_,
address rec_,
uint256 fReward_,
uint256 sReward_
) external onlyRole(SALE_ROLE) {
_amounts[user_] = _amounts[user_] + amount_;
_totalSold = _totalSold + sold_;
_turns[_currentTurn].sold = _turns[_currentTurn].sold + sold_;
_balancesByTurn[user_][_currentTurn] = _balancesByTurn[user_][_currentTurn] + sold_;
if (rec_ != address(0)) {
if (!_recommender[rec_].defined) {
_recommender[rec_].defined = true;
_recommender[rec_].enabled = true;
emit RecommenderSetupSuccessfully(rec_, _firstRecRate, _secondRecRate);
}
_recommenderAmounts[rec_][token_] += fReward_;
_recommenderAmounts[rec_][TOKEN] += sReward_;
_recommendedUsers[user_] = rec_;
}
}
function setTrustRecommender(bool value) external onlyRole(MANAGER_ROLE) {
trustRecommender = value;
}
function enableRecommender(address rec_) external onlyRole(MANAGER_ROLE) {
if (!_recommender[rec_].defined) {
revert RecUndefined(rec_);
}
if (_recommender[rec_].enabled) {
revert RecEnabled(rec_);
}
_recommender[rec_].enabled = true;
emit RecommenderEnabledSuccessfully(rec_);
}
function disableRecommender(address rec_) external onlyRole(MANAGER_ROLE) {
if (!_recommender[rec_].defined) {
revert RecUndefined(rec_);
}
if (!_recommender[rec_].enabled) {
revert RecDisabled(rec_);
}
_recommender[rec_].enabled = false;
emit RecommenderDisabledSuccessfully(rec_);
}
function claimRec(address[] calldata tokens_) external nonReentrant {
address rec_ = _msgSender();
if (tokens_.length == 0) {
revert TokenUndefined();
}
if (!_recommender[rec_].defined) {
revert RecUndefined(rec_);
}
if (!_recommender[rec_].enabled) {
revert RecDisabled(rec_);
}
for (uint256 i = 0; i < tokens_.length; i++) {
address token = tokens_[i];
uint256 balance = _recommenderAmounts[rec_][token];
if (balance == 0) {
continue;
}
_recommenderAmounts[rec_][token] = 0;
if (token == ETH) {
(bool success, ) = rec_.call{value: balance}("");
if (!success) revert TransferNative();
} else {
IERC20(token).safeTransfer(rec_, balance);
}
emit ClaimedFundsSuccessfully(rec_, token, balance);
}
}
function recoverCoin() external onlyRole(DEFAULT_ADMIN_ROLE) {
uint256 balance = address(this).balance;
_msgSender().call{value: balance}("");
emit CoinRecoveredSuccessfully(balance);
}
function recoverErc20(address token_, uint256 amount_) external onlyRole(DEFAULT_ADMIN_ROLE) {
IERC20(token_).safeTransfer(_msgSender(), amount_);
emit Erc20RecoveredSuccessfully(token_, amount_);
}
function getTreasury() external view returns (address) {
return _treasury;
}
function getMax() external view returns (uint256) {
return _max;
}
function getMin() external view returns (uint256) {
return _min;
}
function getTurnsCount() external view returns (uint256) {
return _turns.length;
}
function getCurrentTurn() external view returns (uint256) {
return _currentTurn;
}
function getTurn(uint256 index_) external view returns (Turn memory) {
return _turns[index_];
}
function getTotalSold() external view returns (uint256) {
return _totalSold;
}
function balanceOf(uint256 turn_, address user_) external view returns (uint256) {
return _balancesByTurn[user_][turn_];
}
function recBalanceOf(address token_, address user_) external view returns (uint256) {
return _recommenderAmounts[user_][token_];
}
function limitOf(address user_) external view returns (uint256) {
uint256 amount = _amounts[user_];
uint256 limit = _kycLimit;
if (isKyc(user_)) {
limit = _max;
}
return amount < limit ? limit - amount : 0;
}
function maxLimitOf(address user_) external view returns (uint256) {
uint256 amount = _amounts[user_];
return amount < _max ? _max - amount : 0;
}
function getKycLimit() external view returns (uint256) {
return _kycLimit;
}
function getRecRates() external view returns (uint256, uint256) {
return (_firstRecRate, _secondRecRate);
}
function getRec(address user_, address rec_) external view returns (address) {
if (trustRecommender) {
return rec_;
}
Recommender memory rec = _recommender[_recommendedUsers[user_]];
if (rec.defined && rec.enabled) {
return _recommendedUsers[user_];
}
rec = _recommender[rec_];
if (!rec.defined || rec.enabled) {
return rec_;
}
return address(0);
}
function getRecRates(address rec_) external view returns (uint256, uint256) {
Recommender memory rec = _recommender[rec_];
if (rec.defined) {
return (
Math.max(rec.firstRecRate, _firstRecRate),
Math.max(rec.secondRecRate, _secondRecRate)
);
}
return (_firstRecRate, _secondRecRate);
}
function isActive() public view returns (bool) {
return _turnStatus == TurnStatus.Opened;
}
function isInactive() public view returns (bool) {
return _turnStatus == TurnStatus.Closed;
}
function getPrice(Type type_) public view returns (uint256) {
if (_turns[_currentTurn].turnStatus == TurnStatus.Opened) {
return
type_ == Type.Short
? _turns[_currentTurn].sPrice
: _turns[_currentTurn].lPrice;
}
return 0;
}
function isKyc(address user_) public view returns (bool) {
return _kyc[user_];
}
receive() external payable {}
}
文件 5 的 13:ERC165.sol
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 6 的 13:IAccessControl.sol
pragma solidity ^0.8.20;
interface IAccessControl {
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
error AccessControlBadConfirmation();
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address callerConfirmation) external;
}
文件 7 的 13:IDataSalePoint.sol
pragma solidity ^0.8.24;
interface IDataSalePoint {
enum Type {
Short,
Long
}
enum TurnStatus {
None,
Opened,
Closed
}
struct Turn {
bool defined;
TurnStatus turnStatus;
uint256 sPrice;
uint256 lPrice;
uint256 sold;
uint256 supply;
}
struct Recommender {
bool defined;
bool enabled;
uint256 firstRecRate;
uint256 secondRecRate;
}
function open() external;
function close() external;
function setTurn(uint256 sPrice_, uint256 lPrice_, uint256 supply_) external;
function setRecRate(uint256 firstRecRate_, uint256 secondRecRate_) external;
function setupRecommenders(
address[] calldata refs_,
uint256[] calldata firstRecRate_,
uint256[] calldata secodRecFunds_
) external;
function updateTurnPrice(uint256 index_, uint256 sPrice_, uint256 lPrice_) external;
function updateTurnSupply(uint256 index_, uint256 supply_) external;
function startTurn(uint256 index_) external;
function endTurn(uint256 index_) external;
function setKyc(address user_, bool value_) external;
function setKycBatch(address[] calldata users_, bool[] calldata values_) external;
function setMax(uint256 amount_) external;
function setMin(uint256 amount_) external;
function setKycLimit(uint256 amount_) external;
function setTreasury(address treasury_) external;
function setTurnStatus(
address user_,
address token_,
uint256 amount_,
uint256 sold_,
address ref_,
uint256 fReward_,
uint256 sReward_
) external;
function enableRecommender(address ref_) external;
function disableRecommender(address ref_) external;
function claimRec(address[] calldata tokens_) external;
function recoverCoin() external;
function recoverErc20(address token_, uint256 amount_) external;
function getTreasury() external view returns (address);
function getMax() external view returns (uint256);
function getMin() external view returns (uint256);
function getTurnsCount() external view returns (uint256);
function getCurrentTurn() external view returns (uint256);
function getTurn(uint256 index_) external view returns (Turn memory);
function getTotalSold() external view returns (uint256);
function balanceOf(uint256 turn_, address user_) external view returns (uint256);
function recBalanceOf(address token_, address user_) external view returns (uint256);
function limitOf(address user_) external view returns (uint256);
function maxLimitOf(address user_) external view returns (uint256);
function getKycLimit() external view returns (uint256);
function getRecRates() external view returns (uint256, uint256);
function getRec(address user_, address ref_) external view returns (address);
function getRecRates(address ref_) external view returns (uint256, uint256);
function isActive() external view returns (bool);
function isInactive() external view returns (bool);
function getPrice(Type type_) external view returns (uint256);
function isKyc(address user_) external view returns (bool);
function setTrustRecommender(bool value) external;
}
文件 8 的 13:IERC165.sol
pragma solidity ^0.8.20;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 9 的 13:IERC20.sol
pragma solidity ^0.8.20;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 10 的 13:IERC20Permit.sol
pragma solidity ^0.8.20;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
文件 11 的 13:Math.sol
pragma solidity ^0.8.20;
library Math {
error MathOverflowedMulDiv();
enum Rounding {
Floor,
Ceil,
Trunc,
Expand
}
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function average(uint256 a, uint256 b) internal pure returns (uint256) {
return (a & b) + (a ^ b) / 2;
}
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
return a / b;
}
return a == 0 ? 0 : (a - 1) / b + 1;
}
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
uint256 prod0 = x * y;
uint256 prod1;
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 == 0) {
return prod0 / denominator;
}
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
uint256 remainder;
assembly {
remainder := mulmod(x, y, denominator)
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
uint256 twos = denominator & (0 - denominator);
assembly {
denominator := div(denominator, twos)
prod0 := div(prod0, twos)
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
uint256 inverse = (3 * denominator) ^ 2;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
result = prod0 * inverse;
return result;
}
}
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 result = 1 << (log2(a) >> 1);
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
}
}
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
}
}
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
文件 12 的 13:ReentrancyGuard.sol
pragma solidity ^0.8.20;
abstract contract ReentrancyGuard {
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
_status = ENTERED;
}
function _nonReentrantAfter() private {
_status = NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
文件 13 的 13:SafeERC20.sol
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC20Permit} from "../extensions/IERC20Permit.sol";
import {Address} from "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
error SafeERC20FailedOperation(address token);
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data);
if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
revert SafeERC20FailedOperation(address(token));
}
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
(bool success, bytes memory returndata) = address(token).call(data);
return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
}
}
{
"compilationTarget": {
"contracts/data/DataSalePoint.sol": "DataSalePoint"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 300
},
"remappings": [],
"viaIR": true
}
[{"inputs":[{"internalType":"address","name":"treasury_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"Closed","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"reward_","type":"uint256"}],"name":"FirstRecFunds","type":"error"},{"inputs":[{"internalType":"uint256","name":"limit_","type":"uint256"},{"internalType":"uint256","name":"min_","type":"uint256"},{"internalType":"uint256","name":"max_","type":"uint256"}],"name":"KycLimit","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"max_","type":"uint256"}],"name":"Max","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"min_","type":"uint256"}],"name":"Min","type":"error"},{"inputs":[],"name":"ParamsInvalid","type":"error"},{"inputs":[{"internalType":"address","name":"rec_","type":"address"}],"name":"RecDisabled","type":"error"},{"inputs":[{"internalType":"address","name":"rec_","type":"address"}],"name":"RecEnabled","type":"error"},{"inputs":[{"internalType":"address","name":"rec_","type":"address"}],"name":"RecUndefined","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"uint256","name":"reward_","type":"uint256"}],"name":"SecondRecFunds","type":"error"},{"inputs":[],"name":"Started","type":"error"},{"inputs":[],"name":"TokenUndefined","type":"error"},{"inputs":[],"name":"TransferNative","type":"error"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"TurnClosed","type":"error"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"TurnStarted","type":"error"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"TurnSupply","type":"error"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"TurnUndefined","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rec","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimedFundsSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CoinRecoveredSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Erc20RecoveredSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"KycLimitUpdatedSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"KycUserUpdatedSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxUpdatedSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinUpdatedSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"firstRecRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondRecRate","type":"uint256"}],"name":"RecRateSetupSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rec","type":"address"}],"name":"RecommenderDisabledSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rec","type":"address"}],"name":"RecommenderEnabledSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rec","type":"address"},{"indexed":false,"internalType":"uint256","name":"firstRecRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondRecRate","type":"uint256"}],"name":"RecommenderSetupSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"treasury","type":"address"}],"name":"TreasuryUpdatedSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"TurnAddedSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"turn","type":"uint256"}],"name":"TurnClosedSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"turn","type":"uint256"}],"name":"TurnOpenedSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"turn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lPrice","type":"uint256"}],"name":"TurnPriceUpdatedSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum IDataSalePoint.TurnStatus","name":"turnStatus","type":"uint8"}],"name":"TurnStatusUpdatedSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"turn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"TurnSupplyUpdatedSuccessfully","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RUNNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"turn_","type":"uint256"},{"internalType":"address","name":"user_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens_","type":"address[]"}],"name":"claimRec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rec_","type":"address"}],"name":"disableRecommender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rec_","type":"address"}],"name":"enableRecommender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"endTurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentTurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getKycLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IDataSalePoint.Type","name":"type_","type":"uint8"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"address","name":"rec_","type":"address"}],"name":"getRec","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRecRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rec_","type":"address"}],"name":"getRecRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"getTurn","outputs":[{"components":[{"internalType":"bool","name":"defined","type":"bool"},{"internalType":"enum IDataSalePoint.TurnStatus","name":"turnStatus","type":"uint8"},{"internalType":"uint256","name":"sPrice","type":"uint256"},{"internalType":"uint256","name":"lPrice","type":"uint256"},{"internalType":"uint256","name":"sold","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"internalType":"struct IDataSalePoint.Turn","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTurnsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInactive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"isKyc","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"limitOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"maxLimitOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"user_","type":"address"}],"name":"recBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"recoverErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"bool","name":"value_","type":"bool"}],"name":"setKyc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users_","type":"address[]"},{"internalType":"bool[]","name":"values_","type":"bool[]"}],"name":"setKycBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setKycLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setMin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"firstRecRate_","type":"uint256"},{"internalType":"uint256","name":"secondRecRate_","type":"uint256"}],"name":"setRecRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasury_","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setTrustRecommender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sPrice_","type":"uint256"},{"internalType":"uint256","name":"lPrice_","type":"uint256"},{"internalType":"uint256","name":"supply_","type":"uint256"}],"name":"setTurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"address","name":"token_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"sold_","type":"uint256"},{"internalType":"address","name":"rec_","type":"address"},{"internalType":"uint256","name":"fReward_","type":"uint256"},{"internalType":"uint256","name":"sReward_","type":"uint256"}],"name":"setTurnStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"rec_","type":"address[]"},{"internalType":"uint256[]","name":"firstRecRate_","type":"uint256[]"},{"internalType":"uint256[]","name":"secodRecFunds_","type":"uint256[]"}],"name":"setupRecommenders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"startTurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustRecommender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"},{"internalType":"uint256","name":"sPrice_","type":"uint256"},{"internalType":"uint256","name":"lPrice_","type":"uint256"}],"name":"updateTurnPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"},{"internalType":"uint256","name":"supply_","type":"uint256"}],"name":"updateTurnSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]