HoodPonzi
0x6ff8c99d7964b55d5faa7e3d42a2078f422380d1
Verification
Verified
v0.8.19+commit.7dd6d404
Type
Contract
16,248 bytes
ABI entries
58
28 read · 16 write
License
none
Contract information
- Address
- 0x6ff8c99d7964b55d5faa7e3d42a2078f422380d1
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.19+commit.7dd6d404
- Optimization
- Disabled
- Creator
- 0xE133AB0C07…3b739970B0
- Creation tx
- 0xa472c360cd…6cac3cf3c5
Token
Not a token
This contract does not expose ERC-20 metadata.
Read contract (28)
baseDailyRewardPercentage() → uint256
calculatePendingMiningRewards(address) → uint256
claimTaxWallet() → address
compoundCooldown() → uint256
depositTaxWallet() → address
developerFeePercentage() → uint256
getTotalEarnings(address) → uint256
getUserInfo(address) → uint256, uint256, uint256, uint256
launchedAt() → uint256
maxDailyRewardPercentage() → uint256
minDepositAmount() → uint256
owner() → address
referralTaxPercentage() → uint256
rewardClaimFeePercentage() → uint256
totalDeposits() → uint256
totalMiningPool() → uint256
totalMiningRewardsPaid() → uint256
totalReferralPool() → uint256
totalReferralRewardsPaid() → uint256
totalUsers() → uint256
tradingActive() → bool
userBankedRewards(address) → uint256
userDeposits(address) → uint256
userLastClaimTime(address) → uint256
userLastCompoundTime(address) → uint256
userMiningEarnings(address) → uint256
userReferralEarnings(address) → uint256
userReferrer(address) → address
Events (13)
BaseDailyRewardPercentageUpdatedClaimReferralRewardsClaimRewardsCompoundCooldownUpdatedCompoundRewardsDepositDeveloperFeePercentageUpdatedEmergencyWithdrawMaxDailyRewardPercentageUpdatedMinDepositAmountUpdatedReferralTaxPercentageUpdatedRewardClaimFeePercentageUpdatedTradingEnabled
ABI
[
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newValue",
"type": "uint256"
}
],
"name": "BaseDailyRewardPercentageUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "ClaimReferralRewards",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "ClaimRewards",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newValue",
"type": "uint256"
}
],
"name": "CompoundCooldownUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "CompoundRewards",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "referrer",
"type": "address"
}
],
"name": "Deposit",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newValue",
"type": "uint256"
}
],
"name": "DeveloperFeePercentageUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "EmergencyWithdraw",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newValue",
"type": "uint256"
}
],
"name": "MaxDailyRewardPercentageUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newValue",
"type": "uint256"
}
],
"name": "MinDepositAmountUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newValue",
"type": "uint256"
}
],
"name": "ReferralTaxPercentageUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newValue",
"type": "uint256"
}
],
"name": "RewardClaimFeePercentageUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "launchedAt",
"type": "uint256"
}
],
"name": "TradingEnabled",
"type": "event"
},
{
"inputs": [],
"name": "addExternalRevenue",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "baseDailyRewardPercentage",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_user",
"type": "address"
}
],
"name": "calculatePendingMiningRewards",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_wallet",
"type": "address"
}
],
"name": "changeClaimTaxWallet",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_wallet",
"type": "address"
}
],
"name": "changeDepositTaxWallet",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_newOwner",
"type": "address"
}
],
"name": "changeOwner",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "claimReferralRewards",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "claimRewards",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "claimTaxWallet",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "compoundCooldown",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "compoundRewards",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_referrer",
"type": "address"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "depositTaxWallet",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "developerFeePercentage",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "enableTrading",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_user",
"type": "address"
}
],
"name": "getTotalEarnings",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_user",
"type": "address"
}
],
"name": "getUserInfo",
"outputs": [
{
"internalType": "uint256",
"name": "deposited",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawable",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawableAfterFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "dailyRate",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "launchedAt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "maxDailyRewardPercentage",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "minDepositAmount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "referralTaxPercentage",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "rewardClaimFeePercentage",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_value",
"type": "uint256"
}
],
"name": "setBaseDailyRewardPercentage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_value",
"type": "uint256"
}
],
"name": "setCompoundCooldown",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_value",
"type": "uint256"
}
],
"name": "setDeveloperFeePercentage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_value",
"type": "uint256"
}
],
"name": "setMaxDailyRewardPercentage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_value",
"type": "uint256"
}
],
"name": "setMinDepositAmount",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_value",
"type": "uint256"
}
],
"name": "setReferralTaxPercentage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_value",
"type": "uint256"
}
],
"name": "setRewardClaimFeePercentage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "totalDeposits",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalMiningPool",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalMiningRewardsPaid",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalReferralPool",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalReferralRewardsPaid",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalUsers",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "tradingActive",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "userBankedRewards",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "userDeposits",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "userLastClaimTime",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "userLastCompoundTime",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "userMiningEarnings",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "userReferralEarnings",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "userReferrer",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
}
]Source code
pragma solidity 0.8.19;
// https://x.com/thehoodponzi
// https://www.thehoodponzi.com
contract HoodPonzi {
// ===== TUNABLE PARAMETERS (owner-adjustable) =====
uint256 public baseDailyRewardPercentage = 8;
uint256 public maxDailyRewardPercentage = 12;
uint256 public referralTaxPercentage = 10;
uint256 public developerFeePercentage = 5;
uint256 public rewardClaimFeePercentage = 5;
uint256 public minDepositAmount = 0.01 ether;
uint256 public compoundCooldown = 3600;
// ===== ADDRESSES =====
address public owner;
address public depositTaxWallet;
address public claimTaxWallet;
// ===== REENTRANCY GUARD =====
bool private locked = false;
// ===== POOLS =====
uint256 public totalMiningPool;
uint256 public totalReferralPool;
// ===== USER DATA =====
mapping(address => uint256) public userDeposits;
mapping(address => uint256) public userReferralEarnings;
mapping(address => uint256) public userMiningEarnings;
mapping(address => uint256) public userBankedRewards;
mapping(address => uint256) public userLastClaimTime;
mapping(address => uint256) public userLastCompoundTime;
mapping(address => address) public userReferrer;
// ===== STATISTICS =====
uint256 public totalUsers;
uint256 public totalDeposits;
uint256 public totalMiningRewardsPaid;
uint256 public totalReferralRewardsPaid;
// ===== CONTROL =====
bool public tradingActive = false;
uint256 public launchedAt;
// ===== EVENTS =====
event Deposit(address indexed user, uint256 amount, address indexed referrer);
event ClaimRewards(address indexed user, uint256 amount);
event ClaimReferralRewards(address indexed user, uint256 amount);
event CompoundRewards(address indexed user, uint256 amount);
event TradingEnabled(uint256 launchedAt);
event EmergencyWithdraw(uint256 amount);
event BaseDailyRewardPercentageUpdated(uint256 newValue);
event MaxDailyRewardPercentageUpdated(uint256 newValue);
event ReferralTaxPercentageUpdated(uint256 newValue);
event DeveloperFeePercentageUpdated(uint256 newValue);
event RewardClaimFeePercentageUpdated(uint256 newValue);
event MinDepositAmountUpdated(uint256 newValue);
event CompoundCooldownUpdated(uint256 newValue);
// ===== MODIFIERS =====
modifier onlyOwner() {
require(msg.sender == owner, "Only owner can call this function");
_;
}
modifier validDeposit() {
require(tradingActive, "Trading is not active yet");
require(msg.value >= minDepositAmount, "Deposit amount is below minimum");
_;
}
modifier userExists() {
require(userDeposits[msg.sender] > 0, "User does not exist");
_;
}
modifier respectsCompoundCooldown() {
require(
block.timestamp >= userLastCompoundTime[msg.sender] + compoundCooldown,
"Compound cooldown not met"
);
_;
}
modifier noReentrancy() {
require(!locked, "Reentrancy detected");
locked = true;
_;
locked = false;
}
// ===== CONSTRUCTOR =====
constructor() {
owner = msg.sender;
depositTaxWallet = 0x3f4827B088B484b6976b07Ee0e246dbaD4ca2b80;
claimTaxWallet = 0xfFc5FD7a5e3b3dd06EE81f53f0337A7122CA347a;
}
// ===== OWNER FUNCTIONS =====
function enableTrading() external onlyOwner {
require(!tradingActive, "Trading is already active");
tradingActive = true;
launchedAt = block.timestamp;
emit TradingEnabled(launchedAt);
}
function changeOwner(address _newOwner) public onlyOwner {
require(_newOwner != address(0), "New owner cannot be zero address");
owner = _newOwner;
}
function changeDepositTaxWallet(address _wallet) public onlyOwner {
require(_wallet != address(0), "Cannot be zero address");
require(_wallet.code.length == 0, "Must be EOA");
depositTaxWallet = _wallet;
}
function changeClaimTaxWallet(address _wallet) public onlyOwner {
require(_wallet != address(0), "Cannot be zero address");
require(_wallet.code.length == 0, "Must be EOA");
claimTaxWallet = _wallet;
}
function addExternalRevenue() public payable onlyOwner {
totalMiningPool += msg.value;
}
function setBaseDailyRewardPercentage(uint256 _value) external onlyOwner {
require(_value <= maxDailyRewardPercentage, "Base cannot exceed max");
baseDailyRewardPercentage = _value;
emit BaseDailyRewardPercentageUpdated(_value);
}
function setMaxDailyRewardPercentage(uint256 _value) external onlyOwner {
require(_value >= baseDailyRewardPercentage, "Max cannot be below base");
require(_value <= 100, "Max cannot exceed 100");
maxDailyRewardPercentage = _value;
emit MaxDailyRewardPercentageUpdated(_value);
}
function setReferralTaxPercentage(uint256 _value) external onlyOwner {
require(_value + developerFeePercentage < 100, "Referral tax + developer fee must be below 100%");
referralTaxPercentage = _value;
emit ReferralTaxPercentageUpdated(_value);
}
function setDeveloperFeePercentage(uint256 _value) external onlyOwner {
require(referralTaxPercentage + _value < 100, "Referral tax + developer fee must be below 100%");
developerFeePercentage = _value;
emit DeveloperFeePercentageUpdated(_value);
}
function setRewardClaimFeePercentage(uint256 _value) external onlyOwner {
require(_value <= 100, "Claim fee cannot exceed 100%");
rewardClaimFeePercentage = _value;
emit RewardClaimFeePercentageUpdated(_value);
}
function setMinDepositAmount(uint256 _value) external onlyOwner {
require(_value > 0, "Must be greater than zero");
minDepositAmount = _value;
emit MinDepositAmountUpdated(_value);
}
function setCompoundCooldown(uint256 _value) external onlyOwner {
compoundCooldown = _value;
emit CompoundCooldownUpdated(_value);
}
// ===== MAIN FUNCTIONS =====
/**
* @dev Deposit ETH
*
* With referrer : 85% pool | 10% referrer (pull) | 5% depositTaxWallet
* No referrer : 90% pool | 5% depositTaxWallet (referral) | 5% depositTaxWallet (fee)
*/
function deposit(address _referrer) public payable validDeposit noReentrancy {
_checkpointRewards(msg.sender);
uint256 referralTax = msg.value * referralTaxPercentage / 100;
uint256 developerFee = msg.value * developerFeePercentage / 100;
uint256 miningPoolAmount = msg.value - referralTax - developerFee;
totalMiningPool += miningPoolAmount;
if (userDeposits[msg.sender] == 0) {
totalUsers++;
userLastCompoundTime[msg.sender] = block.timestamp;
}
userDeposits[msg.sender] += msg.value;
totalDeposits += msg.value;
uint256 devReferralPush = 0;
if (userReferrer[msg.sender] != address(0)) {
userReferralEarnings[userReferrer[msg.sender]] += referralTax;
totalReferralPool += referralTax;
} else if (_referrer != address(0) && _referrer != msg.sender) {
userReferrer[msg.sender] = _referrer;
userReferralEarnings[_referrer] += referralTax;
totalReferralPool += referralTax;
} else {
uint256 devShare = referralTax / 2;
uint256 poolShare = referralTax - devShare;
totalMiningPool += poolShare;
devReferralPush = devShare;
}
emit Deposit(msg.sender, msg.value, userReferrer[msg.sender]);
(bool ok1, ) = payable(depositTaxWallet).call{value: developerFee}("");
require(ok1, "Deposit fee transfer failed");
if (devReferralPush > 0) {
(bool ok2, ) = payable(depositTaxWallet).call{value: devReferralPush}("");
require(ok2, "Dev referral transfer failed");
}
}
/**
* @dev Claim mining rewards.
*
*/
function claimRewards() public userExists noReentrancy {
uint256 rewards = calculatePendingMiningRewards(msg.sender);
require(rewards > 0, "No rewards to claim");
uint256 claimFee = rewards * rewardClaimFeePercentage / 100;
uint256 userRewards = rewards - claimFee;
userMiningEarnings[msg.sender] += userRewards;
userBankedRewards[msg.sender] = 0;
userLastClaimTime[msg.sender] = block.timestamp;
totalMiningRewardsPaid += userRewards;
totalMiningPool -= rewards;
emit ClaimRewards(msg.sender, userRewards);
(bool ok1, ) = payable(claimTaxWallet).call{value: claimFee}("");
require(ok1, "Claim fee transfer failed");
(bool ok2, ) = payable(msg.sender).call{value: userRewards}("");
require(ok2, "Rewards transfer failed");
}
/**
* @dev Compound rewards back into deposit - 1 hour cooldown.
*/
function compoundRewards() public userExists respectsCompoundCooldown noReentrancy {
uint256 rewards = calculatePendingMiningRewards(msg.sender);
require(rewards > 0, "No rewards to compound");
userMiningEarnings[msg.sender] += rewards;
userBankedRewards[msg.sender] = 0;
userLastClaimTime[msg.sender] = block.timestamp;
userLastCompoundTime[msg.sender] = block.timestamp;
totalMiningPool -= rewards;
userDeposits[msg.sender] += rewards;
totalDeposits += rewards;
emit CompoundRewards(msg.sender, rewards);
}
/**
* @dev Claim referral rewards
*/
function claimReferralRewards() public noReentrancy {
uint256 rewards = userReferralEarnings[msg.sender];
require(rewards > 0, "No referral rewards to claim");
userReferralEarnings[msg.sender] = 0;
totalReferralRewardsPaid += rewards;
totalReferralPool -= rewards;
(bool success, ) = payable(msg.sender).call{value: rewards}("");
require(success, "Referral rewards transfer failed");
emit ClaimReferralRewards(msg.sender, rewards);
}
// ===== VIEW FUNCTIONS =====
/**
* @dev Reward accrued by the user's CURRENT deposit balance since userLastClaimTime.
* Does not include already-banked rewards from a prior, smaller balance.
*/
function _freshAccrual(address _user) internal view returns (uint256) {
if (userDeposits[_user] == 0 || totalDeposits == 0) return 0;
uint256 timePassed = block.timestamp - userLastClaimTime[_user];
uint256 userShare = userDeposits[_user] * 1e18 / totalDeposits;
uint256 dailyRate = _getCurrentDailyRewardPercentage();
uint256 dailyRewards = totalMiningPool * dailyRate / 100;
uint256 userDailyRewards = dailyRewards * userShare / 1e18;
return userDailyRewards * timePassed / 86400;
}
function calculatePendingMiningRewards(address _user) public view returns (uint256) {
uint256 total = userBankedRewards[_user] + _freshAccrual(_user);
return total > totalMiningPool ? totalMiningPool : total;
}
function getUserInfo(address _user) public view returns (
uint256 deposited,
uint256 withdrawable,
uint256 withdrawableAfterFee,
uint256 dailyRate
) {
deposited = userDeposits[_user];
withdrawable = calculatePendingMiningRewards(_user);
withdrawableAfterFee = withdrawable * (100 - rewardClaimFeePercentage) / 100;
dailyRate = totalDeposits > 0 ? _getCurrentDailyRewardPercentage() : 0;
}
function getTotalEarnings(address _user) public view returns (uint256) {
return userMiningEarnings[_user] + userReferralEarnings[_user] + calculatePendingMiningRewards(_user);
}
// ===== INTERNAL =====
/**
* @dev Bank the reward earned by the current balance up to now, then reset the
* accrual clock. Must be called before userDeposits[_user] changes for any
* reason other than claim/compound (which already reset the clock themselves).
*/
function _checkpointRewards(address _user) internal {
uint256 fresh = _freshAccrual(_user);
if (fresh > 0) {
userBankedRewards[_user] += fresh;
}
userLastClaimTime[_user] = block.timestamp;
}
function _getCurrentDailyRewardPercentage() internal view returns (uint256) {
if (totalDeposits == 0) return 0;
uint256 contractRatio = totalMiningPool * 100 / totalDeposits;
if (contractRatio < 80) {
return baseDailyRewardPercentage * contractRatio / 80;
} else if (contractRatio > 120) {
uint256 bonus = (contractRatio - 120) / 30;
uint256 increasedReward = baseDailyRewardPercentage + bonus;
return increasedReward > maxDailyRewardPercentage
? maxDailyRewardPercentage
: increasedReward;
}
return baseDailyRewardPercentage;
}
}
Chain explorer3615msChain node80ms