// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)pragmasolidity ^0.8.20;/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/abstractcontractContext{
function_msgSender() internalviewvirtualreturns (address) {
returnmsg.sender;
}
function_msgData() internalviewvirtualreturns (bytescalldata) {
returnmsg.data;
}
function_contextSuffixLength() internalviewvirtualreturns (uint256) {
return0;
}
}
Contract Source Code
File 2 of 6: IERC20.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)pragmasolidity ^0.8.20;/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/interfaceIERC20{
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/eventTransfer(addressindexedfrom, addressindexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/eventApproval(addressindexed owner, addressindexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/functiontotalSupply() externalviewreturns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/functionbalanceOf(address account) externalviewreturns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/functiontransfer(address to, uint256 value) externalreturns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/functionallowance(address owner, address spender) externalviewreturns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/functionapprove(address spender, uint256 value) externalreturns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/functiontransferFrom(addressfrom, address to, uint256 value) externalreturns (bool);
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)pragmasolidity ^0.8.20;import {Context} from"../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/abstractcontractOwnableisContext{
addressprivate _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/errorOwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/errorOwnableInvalidOwner(address owner);
eventOwnershipTransferred(addressindexed previousOwner, addressindexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/constructor(address initialOwner) {
if (initialOwner ==address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/modifieronlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/functionowner() publicviewvirtualreturns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/function_checkOwner() internalviewvirtual{
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/functionrenounceOwnership() publicvirtualonlyOwner{
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/functiontransferOwnership(address newOwner) publicvirtualonlyOwner{
if (newOwner ==address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/function_transferOwnership(address newOwner) internalvirtual{
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
Contract Source Code
File 6 of 6: RewardLoaderLock.sol
// SPDX-License-Identifier: MITpragmasolidity >=0.8.0 <0.9.0;// contractsimport"@openzeppelin/contracts/access/Ownable.sol";
// interfacesimport"./interfaces/IRewardLoaderLock.sol";
import"./interfaces/IStandardRewardInterface.sol";
import"@openzeppelin/contracts/token/ERC20/IERC20.sol";
/**
@title RewardLoaderLock
@notice Contract for distributing rewards to the lock pool with USA tokens and DEDPRZ NFTS. Passive and gas efficient rewards farming.
@author github @bullishpaisa
*/contractRewardLoaderLockisIRewardLoaderLock, Ownable{
stringpublicconstant LABEL_CONTRACT ="RewardLoaderLock NFT";
IERC20 publicimmutable rewardToken_USA_1;
IERC20 publicimmutable rewardToken_WETH_2;
IERC20 publicimmutable rewardToken_Stable_3;
// reward contracts
IStandardRewardInterface publicimmutable rewardContract;
mapping(address=>bool) public onlyDistributor;
// ModifiersmodifieronlyDistributorAllowed() {
require(
onlyDistributor[msg.sender],
"RewardLoaderLock: caller not allowed"
);
_;
}
constructor(address _rewardToken_USA_1,
address _rewardToken_WETH_2,
address _rewardToken_Stable_3,
address _owner,
address _erc20LockUSA
) Ownable(_owner) {
rewardToken_USA_1 = IERC20(_rewardToken_USA_1);
rewardToken_WETH_2 = IERC20(_rewardToken_WETH_2);
rewardToken_Stable_3 = IERC20(_rewardToken_Stable_3);
onlyDistributor[_owner] =true;
rewardContract = IStandardRewardInterface(_erc20LockUSA);
}
functiontransferRewardToUsaLockStake() externalonlyDistributorAllowed{
// check that the contract has been setrequire(
address(rewardContract) !=address(0),
"RewardLoaderLock: rewardContract not set"
);
// transfer the complete balance of the reward tokens to the reward contractuint256 amount_usa_1 = rewardToken_USA_1.balanceOf(address(this));
uint256 amount_weth_2 = rewardToken_WETH_2.balanceOf(address(this));
uint256 amount_stable_3 = rewardToken_Stable_3.balanceOf(address(this));
if (amount_usa_1 ==0&& amount_weth_2 ==0&& amount_stable_3 ==0) {
return;
}
// if the amount is not 0, approve the reward contract to spend the amount for usaif (amount_usa_1 >0) {
rewardToken_USA_1.approve(address(rewardContract), amount_usa_1);
}
if (amount_weth_2 >0) {
rewardToken_WETH_2.approve(address(rewardContract), amount_weth_2);
}
if (amount_stable_3 >0) {
rewardToken_Stable_3.approve(
address(rewardContract),
amount_stable_3
);
}
rewardContract.distributeRewardsForLatestPeriod(
amount_usa_1,
amount_weth_2,
amount_stable_3
);
emit TransferRewardToUsaLockStake(
amount_usa_1,
amount_weth_2,
amount_stable_3
);
}
functionfinalizePeriodNoRewards() externalonlyDistributorAllowed{
// check that the contract has been setrequire(
address(rewardContract) !=address(0),
"RewardLoaderLock: rewardContract not set"
);
rewardContract.distributeRewardsForLatestPeriod(0, 0, 0);
emit TransferRewardToUsaLockStake(0, 0, 0);
}
// withdaw all rewards from the contractfunctionwithdrawAllRewards() externalonlyDistributorAllowed{
// transfer the amount to the owneruint256 amount_usa_1_ = rewardToken_USA_1.balanceOf(address(this));
rewardToken_USA_1.transfer(owner(), amount_usa_1_);
uint256 amount_weth_2_ = rewardToken_WETH_2.balanceOf(address(this));
rewardToken_WETH_2.transfer(owner(), amount_weth_2_);
uint256 amount_stable_3_ = rewardToken_Stable_3.balanceOf(
address(this)
);
rewardToken_Stable_3.transfer(owner(), amount_stable_3_);
emit RewardsWithdrawnToOwner(
amount_usa_1_,
amount_weth_2_,
amount_stable_3_
);
}
// function that withdraws any token from the contract (all of them)functionwithdrawToken(address token) externalonlyOwner{
IERC20 _token = IERC20(token);
_token.transfer(owner(), _token.balanceOf(address(this)));
emit TokenWithdrawnManualAllToOwner(
token,
_token.balanceOf(address(this))
);
}
// Configuration functionsfunctionaddDistributor(address _distributor,
bool _setting
) externalonlyOwner{
onlyDistributor[_distributor] = _setting;
emit DistributorAdded(_distributor, _setting);
}
}