Address Contract Partially Verified
Address
0xDf4Aa37a2927deb886f3DC3d070C55b5088124FF
Balance
0 ETH
Nonce
1
Code Size
2777 bytes
Creator
0x222c41D3...4DBf at tx 0x4c7f6e0d...6ce48e
Indexed Transactions
0
Contract Bytecode
2777 bytes
0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806307550ba3146100515780635753bfca1461007a57806360491ff41461009a57806362710eff146100ba575b600080fd5b61006461005f3660046107d7565b6100da565b604051610071919061086f565b60405180910390f35b61008d6100883660046108da565b6101c0565b6040516100719190610925565b6100ad6100a83660046107d7565b61043e565b6040516100719190610945565b6100cd6100c83660046108da565b610500565b604051610071919061099b565b60608160008167ffffffffffffffff8111156100f8576100f86109c5565b60405190808252806020026020018201604052801561015657816020015b610143604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816101165790505b50905060005b828110156101b557610190888888888581811061017b5761017b6109db565b90506020020160208101906100c891906109f1565b8282815181106101a2576101a26109db565b602090810291909101015260010161015c565b509695505050505050565b60408051808201909152600080825260208201526040516370a0823160e01b81526001600160a01b038481166004830152600091908416906370a0823190602401602060405180830381865afa15801561021e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102429190610a15565b60405163402853f760e11b81526001600160a01b0386811660048301528581166024830152919250600091871690638050a7ee90604401602060405180830381865afa158015610296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ba9190610a15565b905060006102c74261079f565b90506000828210156102da5760006102f2565b62093a806102e88484610a44565b6102f29190610a57565b90506000610301601483610a57565b61030c906001610a79565b905060005b818110156103965760405163ca31879d60e01b81526001600160a01b038a8116600483015289811660248301528b169063ca31879d906044016020604051808303816000875af1158015610369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038d9190610a15565b50600101610311565b506040516370a0823160e01b81526001600160a01b038981166004830152600091908916906370a0823190602401602060405180830381865afa1580156103e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104059190610a15565b905060006104138783610a44565b604080518082019091526001600160a01b03909a168a5260208a015250969998505050505050505050565b60608160008167ffffffffffffffff81111561045c5761045c6109c5565b6040519080825280602002602001820160405280156104a157816020015b604080518082019091526000808252602082015281526020019060019003908161047a5790505b50905060005b828110156101b5576104db88888888858181106104c6576104c66109db565b905060200201602081019061008891906109f1565b8282815181106104ed576104ed6109db565b60209081029190910101526001016104a7565b61052d604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b6040516370a0823160e01b81526001600160a01b038481166004830152600091908416906370a0823190602401602060405180830381865afa158015610577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059b9190610a15565b60405163402853f760e11b81526001600160a01b0386811660048301528581166024830152919250600091871690638050a7ee90604401602060405180830381865afa1580156105ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106139190610a15565b905060006106204261079f565b905060008282101561063357600061064b565b62093a806106418484610a44565b61064b9190610a57565b9050600061065a601483610a57565b610665906001610a79565b905060005b818110156106ef5760405163ca31879d60e01b81526001600160a01b038a8116600483015289811660248301528b169063ca31879d906044016020604051808303816000875af11580156106c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e69190610a15565b5060010161066a565b506040516370a0823160e01b81526001600160a01b038981166004830152600091908916906370a0823190602401602060405180830381865afa15801561073a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075e9190610a15565b9050600061076c8783610a44565b604080516060810182526001600160a01b03909b168b5260208b0191909152890192909252509598975050505050505050565b600062093a806107af8184610a57565b6107b99190610a8c565b92915050565b6001600160a01b03811681146107d457600080fd5b50565b600080600080606085870312156107ed57600080fd5b84356107f8816107bf565b93506020850135610808816107bf565b9250604085013567ffffffffffffffff81111561082457600080fd5b8501601f8101871361083557600080fd5b803567ffffffffffffffff81111561084c57600080fd5b8760208260051b840101111561086157600080fd5b949793965060200194505050565b602080825282518282018190526000918401906040840190835b818110156108cf576108b983855180516001600160a01b0316825260208082015190830152604090810151910152565b6020939093019260609290920191600101610889565b509095945050505050565b6000806000606084860312156108ef57600080fd5b83356108fa816107bf565b9250602084013561090a816107bf565b9150604084013561091a816107bf565b809150509250925092565b81516001600160a01b0316815260208083015190820152604081016107b9565b602080825282518282018190526000918401906040840190835b818110156108cf5761098583855180516001600160a01b03168252602090810151910152565b602093909301926040929092019160010161095f565b81516001600160a01b031681526020808301519082015260408083015190820152606081016107b9565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060208284031215610a0357600080fd5b8135610a0e816107bf565b9392505050565b600060208284031215610a2757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107b9576107b9610a2e565b600082610a7457634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156107b9576107b9610a2e565b80820281158282048414176107b9576107b9610a2e56fea2646970667358221220f921bb28e9a660aac49a4e8e9c582c08e2021a3a204356b86af4713d79035cdc64736f6c634300081e0033
Verified Source Code Partial Match
Compiler: v0.8.30+commit.73712a01
EVM: paris
Optimization: Yes (1000 runs)
LensRewardV2.sol 160 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
interface IERC20 {
function balanceOf(address account) external view returns (uint256);
}
interface IRewardDistributor {
function claimToken(address user, IERC20 token) external returns (uint256);
function getUserTokenTimeCursor(address user, IERC20 token) external view returns (uint256);
}
/**
* @title Lens Reward V2
* @notice Enhanced version that calculates and executes multiple claimToken calls
* to ensure all available rewards are claimed, even if more than 20 weeks have passed.
*/
contract LensRewardV2 {
uint256 private constant WEEKS_PER_CLAIM = 20;
uint256 private constant ONE_WEEK = 1 weeks;
struct ClaimableRewards {
address token;
uint256 claimableAmount;
}
struct ClaimableRewardsWithCount {
address token;
uint256 claimableAmount;
uint256 numberOfClaims;
}
/**
* @notice Rounds a timestamp down to the beginning of the week (Thursday 00:00 UTC)
* @param timestamp The timestamp to round down
* @return The rounded down timestamp
*/
function _roundDownTimestamp(uint256 timestamp) private pure returns (uint256) {
return (timestamp / ONE_WEEK) * ONE_WEEK;
}
/**
* @notice Claims all available rewards for a user and token by calling claimToken multiple times
* @param distributor The RewardDistributor contract
* @param user The user address
* @param token The token address
* @return ClaimableRewards struct with token address, total claimed amount, and number of claims made
*/
function getUserClaimableReward(
IRewardDistributor distributor,
address user,
IERC20 token
) public returns (ClaimableRewards memory) {
uint256 balanceBefore = token.balanceOf(user);
uint256 userTokenCursor = distributor.getUserTokenTimeCursor(user, token);
uint256 currentWeek = _roundDownTimestamp(block.timestamp);
// Calculate difference in weeks: (currentWeek - userTokenCursor) / ONE_WEEK
// optimistically use 1 week in case difference is zero
uint256 weeksDiff = currentWeek >= userTokenCursor ? (currentWeek - userTokenCursor) / ONE_WEEK : 0;
uint256 claimsCount = (weeksDiff / WEEKS_PER_CLAIM) + 1;
for (uint256 i = 0; i < claimsCount; ++i) {
distributor.claimToken(user, token);
}
uint256 balanceAfter = token.balanceOf(user);
uint256 totalClaimed = balanceAfter - balanceBefore;
return ClaimableRewards({
token: address(token),
claimableAmount: totalClaimed
});
}
/**
* @notice Claims all available rewards for a user and token by calling claimToken multiple times
* @param distributor The RewardDistributor contract
* @param user The user address
* @param token The token address
* @return ClaimableRewardsWithCount struct with token address, total claimed amount, and number of claims made
*/
function getUserClaimableRewardWithCount(
IRewardDistributor distributor,
address user,
IERC20 token
) public returns (ClaimableRewardsWithCount memory) {
uint256 balanceBefore = token.balanceOf(user);
uint256 userTokenCursor = distributor.getUserTokenTimeCursor(user, token);
uint256 currentWeek = _roundDownTimestamp(block.timestamp);
// Calculate difference in weeks: (currentWeek - userTokenCursor) / ONE_WEEK
// optimistically use 1 week in case difference is zero
uint256 weeksDiff = currentWeek >= userTokenCursor ? (currentWeek - userTokenCursor) / ONE_WEEK : 0;
uint256 claimsCount = (weeksDiff / WEEKS_PER_CLAIM) + 1;
for (uint256 i = 0; i < claimsCount; ++i) {
distributor.claimToken(user, token);
}
uint256 balanceAfter = token.balanceOf(user);
uint256 totalClaimed = balanceAfter - balanceBefore;
return ClaimableRewardsWithCount({
token: address(token),
claimableAmount: totalClaimed,
numberOfClaims: claimsCount
});
}
/**
* @notice Claims all available rewards for a user across multiple tokens
* @param distributor The RewardDistributor contract
* @param user The user address
* @param tokens Array of token addresses
* @return Array of ClaimableRewards structs
*/
function getUserClaimableRewardsAll(
IRewardDistributor distributor,
address user,
IERC20[] calldata tokens
) external returns (ClaimableRewards[] memory) {
uint256 len = tokens.length;
ClaimableRewards[] memory res = new ClaimableRewards[](len);
for (uint256 i = 0; i < len; ++i) {
res[i] = getUserClaimableReward(distributor, user, tokens[i]);
}
return res;
}
/**
* @notice Claims all available rewards for a user across multiple tokens by calling claimToken multiple times
* @param distributor The RewardDistributor contract
* @param user The user address
* @param tokens Array of token addresses
* @return Array of ClaimableRewardsWithCount structs
*/
function getUserClaimableRewardsAllWithCount(
IRewardDistributor distributor,
address user,
IERC20[] calldata tokens
) external returns (ClaimableRewardsWithCount[] memory) {
uint256 len = tokens.length;
ClaimableRewardsWithCount[] memory res = new ClaimableRewardsWithCount[](len);
for (uint256 i = 0; i < len; ++i) {
res[i] = getUserClaimableRewardWithCount(distributor, user, tokens[i]);
}
return res;
}
}
Write Contract 4 functions
These functions modify contract state and require a wallet transaction to execute.
getUserClaimableReward 0x5753bfca
address distributor
address user
address token
returns: tuple
getUserClaimableRewardWithCount 0x62710eff
address distributor
address user
address token
returns: tuple
getUserClaimableRewardsAll 0x60491ff4
address distributor
address user
address[] tokens
returns: tuple[]
getUserClaimableRewardsAllWithCount 0x07550ba3
address distributor
address user
address[] tokens
returns: tuple[]
Recent Transactions
No transactions found for this address