Address Contract Verified
Address
0xdd5a9EEc299b74B2db2D3430608c1c5A8d9598eb
Balance
0 ETH
Nonce
1
Code Size
6333 bytes
Creator
0x641AD78B...e689 at tx 0x5fc7d9a5...311135
Indexed Transactions
0
Contract Bytecode
6333 bytes
0x608060405234801561001057600080fd5b506004361061021b5760003560e01c80639e447fc611610125578063c8f33c91116100ad578063d153b60c1161007c578063d153b60c146104c8578063dd62ed3e146104db578063ee6c0d5714610514578063f520e7e51461051d578063f7c618c11461052657600080fd5b8063c8f33c911461049c578063cd3daf9d146104a5578063cddaf358146104ad578063cf73a1bc146104b557600080fd5b8063a9059cbb116100f4578063a9059cbb14610448578063b1f8100d1461045b578063b29a81401461046e578063b88a802f14610481578063c0ed00c91461048957600080fd5b80639e447fc6146103ef578063a3fbbaae14610402578063a457c2d714610415578063a4c0ae6f1461042857600080fd5b806339509351116101a85780637b0a47ee116101775780637b0a47ee1461039457806380faa57d1461039d5780638f84aa09146103a557806390717dd3146103b857806395d89b41146103cb57600080fd5b806339509351146103115780634e71e0c81461032457806351ed6a301461032c57806370a082311461036b57600080fd5b80630962c4f9116101ef5780630962c4f9146102be57806318160ddd146102c757806323b872dd146102cf5780632b8c8a64146102e2578063313ce567146102f757600080fd5b80628cc262146102205780630660f1e81461024657806306fdde0314610266578063095ea7b31461029b575b600080fd5b61023361022e3660046116a1565b61054d565b6040519081526020015b60405180910390f35b6102336102543660046116a1565b60086020526000908152604090205481565b61028e6040518060400160405280600981526020016856657273654661726d60b81b81525081565b60405161023d91906116e2565b6102ae6102a9366004611715565b6105d3565b604051901515815260200161023d565b61023360045481565b600054610233565b6102ae6102dd366004611741565b6105ea565b6102f56102f0366004611782565b6106d8565b005b6102ff601281565b60405160ff909116815260200161023d565b6102ae61031f366004611715565b6107f6565b6102f5610832565b6103537f000000000000000000000000682831244b0e97946abc52cb1893cce398de3a3581565b6040516001600160a01b03909116815260200161023d565b6102336103793660046116a1565b6001600160a01b031660009081526001602052604090205490565b61023360035481565b6102336108e2565b600a54610353906001600160a01b031681565b6102f56103c6366004611782565b6108f9565b61028e60405180604001604052806005815260200164564641524d60d81b81525081565b6102f56103fd366004611782565b6109ae565b6102f56104103660046116a1565b610c14565b6102ae610423366004611715565b610d11565b6102336104363660046116a1565b60096020526000908152604090205481565b6102ae610456366004611715565b610d48565b6102f56104693660046116a1565b610dd5565b6102f561047c366004611715565b610ecb565b610233611018565b6102f5610497366004611782565b611144565b61023360065481565b610233611274565b6102f56112e5565b600c54610353906001600160a01b031681565b600b54610353906001600160a01b031681565b6102336104e936600461179b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61023360075481565b61023360055481565b6103537f000000000000000000000000249ca82617ec3dfb2589c4c17ab7ec9765350a1881565b6001600160a01b0381166000908152600960205260408120548190610570611274565b61057a91906117ea565b6001600160a01b03841660009081526008602090815260408083205460019092529091205491925090670de0b6b3a7640000906105b89084906117fd565b6105c29190611814565b6105cc9190611836565b9392505050565b60006105e033848461130a565b5060015b92915050565b60006105f4611274565b6007556105ff6108e2565b6006558361060c8161054d565b6001600160a01b038216600090815260086020908152604080832093909355600754600990915291902055836106418161054d565b6001600160a01b0380831660009081526008602090815260408083209490945560075460098252848320559189168152600282528281203382529091522054600019146106c1576001600160a01b0386166000908152600260209081526040808320338452909152812080548692906106bb9084906117ea565b90915550505b6106cc86868661136c565b50600195945050505050565b6106e0611274565b6007556106eb6108e2565b6006556106f73361054d565b336000908152600860209081526040808320939093556007546009909152919020556004544210156107795780600054116107795760405162461bcd60e51b815260206004820152601960248201527f53696d706c654661726d3a205354494c4c5f4541524e494e470000000000000060448201526064015b60405180910390fd5b3361078482826113ef565b6107af7f000000000000000000000000682831244b0e97946abc52cb1893cce398de3a358284611473565b806001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5836040516107ea91815260200190565b60405180910390a25050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916105e091859061082d908690611836565b61130a565b600b546001600160a01b0316331461088c5760405162461bcd60e51b815260206004820152601d60248201527f53696d706c654661726d3a20494e56414c49445f43414e4449444154450000006044820152606401610770565b600b54600a80546001600160a01b0319166001600160a01b0390921691821790556040519081527fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf369060200160405180910390a1565b600060045442106108f4575060045490565b504290565b610901611274565b60075561090c6108e2565b6006556109183361054d565b3360008181526008602090815260408083209490945560075460099091529290209190915561094782826114db565b6109737f000000000000000000000000682831244b0e97946abc52cb1893cce398de3a3582308561153c565b806001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d836040516107ea91815260200190565b600c546001600160a01b03163314610a085760405162461bcd60e51b815260206004820152601b60248201527f53696d706c654661726d3a20494e56414c49445f4d414e4147455200000000006044820152606401610770565b610a10611274565b600755610a1b6108e2565b600655600054610a665760405162461bcd60e51b815260206004820152601660248201527553696d706c654661726d3a204e4f5f5354414b45525360501b6044820152606401610770565b60008111610ab65760405162461bcd60e51b815260206004820152601860248201527f53696d706c654661726d3a20494e56414c49445f5241544500000000000000006044820152606401610770565b600454426006819055600554610acb91611836565b60045542811115610b8457600354821015610b285760405162461bcd60e51b815260206004820152601e60248201527f53696d706c654661726d3a20524154455f43414e545f444543524541534500006044820152606401610770565b6000610b3442836117ea565b9050600060035482610b4691906117fd565b600c54909150610b81907f000000000000000000000000249ca82617ec3dfb2589c4c17ab7ec9765350a18906001600160a01b031683611473565b50505b6003829055600554600090610b9a9084906117fd565b600c54909150610bd6907f000000000000000000000000249ca82617ec3dfb2589c4c17ab7ec9765350a18906001600160a01b0316308461153c565b60408051848152602081018390527f6c07ee05dcf262f13abf9d87b846ee789d2f90fe991d495acd7d7fc109ee1f55910160405180910390a1505050565b600a546001600160a01b03163314610c6a5760405162461bcd60e51b815260206004820152601960248201527829b4b6b83632a330b9369d1024a72b20a624a22fa7aba722a960391b6044820152606401610770565b6001600160a01b038116610cbc5760405162461bcd60e51b815260206004820152601960248201527853696d706c654661726d3a2057524f4e475f4144445245535360381b6044820152606401610770565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f198db6e425fb8aafd1823c6ca50be2d51e5764571a5ae0f0f21c6812e45def0b906020015b60405180910390a150565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916105e091859061082d9086906117ea565b6000610d52611274565b600755610d5d6108e2565b600655610d693361054d565b3360009081526008602090815260408083209390935560075460099091529190205582610d958161054d565b6001600160a01b038216600090815260086020908152604080832093909355600754600990915291902055610dcb33858561136c565b5060019392505050565b600a546001600160a01b03163314610e2b5760405162461bcd60e51b815260206004820152601960248201527829b4b6b83632a330b9369d1024a72b20a624a22fa7aba722a960391b6044820152606401610770565b6001600160a01b038116610e7d5760405162461bcd60e51b815260206004820152601960248201527853696d706c654661726d3a2057524f4e475f4144445245535360381b6044820152606401610770565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f35b5da26a401fdbef2e1cfabeec2c10a6121d56f136be501a393c284cdd1af5890602001610d06565b7f000000000000000000000000682831244b0e97946abc52cb1893cce398de3a356001600160a01b0316826001600160a01b031603610f485760405162461bcd60e51b815260206004820152601960248201527829b4b6b83632a330b9369d1024a72b20a624a22faa27a5a2a760391b6044820152606401610770565b7f000000000000000000000000249ca82617ec3dfb2589c4c17ab7ec9765350a186001600160a01b0316826001600160a01b031603610fc55760405162461bcd60e51b815260206004820152601960248201527829b4b6b83632a330b9369d1024a72b20a624a22faa27a5a2a760391b6044820152606401610770565b600a54610fdd9083906001600160a01b031683611473565b816001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28826040516107ea91815260200190565b6000611022611274565b60075561102d6108e2565b6006556110393361054d565b336000818152600860209081526040808320949094556007546009909152929020919091556110678161054d565b9150600082116110b95760405162461bcd60e51b815260206004820152601c60248201527f53696d706c654661726d3a204e4f5448494e475f544f5f434c41494d000000006044820152606401610770565b6001600160a01b0381166000908152600860205260408120556110fd7f000000000000000000000000249ca82617ec3dfb2589c4c17ab7ec9765350a188284611473565b806001600160a01b03167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04868360405161113891815260200190565b60405180910390a25090565b600c546001600160a01b0316331461119e5760405162461bcd60e51b815260206004820152601b60248201527f53696d706c654661726d3a20494e56414c49445f4d414e4147455200000000006044820152606401610770565b600081116111ee5760405162461bcd60e51b815260206004820152601c60248201527f53696d706c654661726d3a20494e56414c49445f4455524154494f4e000000006044820152606401610770565b600454421161123f5760405162461bcd60e51b815260206004820181905260248201527f53696d706c654661726d3a204f4e474f494e475f444953545249425554494f4e6044820152606401610770565b60058190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d390602001610d06565b60008054600003611286575060075490565b60006006546112936108e2565b61129d91906117ea565b905060008054670de0b6b3a7640000600354846112ba91906117fd565b6112c491906117fd565b6112ce9190611814565b9050806007546112de9190611836565b9250505090565b336000908152600160205260409020546112fe816106d8565b611306611018565b5050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166000908152600160205260409020546113909082906117ea565b6001600160a01b0384811660008181526001602090815260408083209590955592861680825290849020805486019055925184815290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161135f565b6000805483900381556001600160a01b0382168152600160205260409020546114199083906117ea565b6001600160a01b0382166000818152600160205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906114679086815260200190565b60405180910390a35050565b6040516001600160a01b0383166024820152604481018290526114d690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261157a565b505050565b816000546114e99190611836565b60009081556001600160a01b038216808252600160209081526040808420805487019055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611467565b6040516001600160a01b03808516602483015283166044820152606481018290526115749085906323b872dd60e01b9060840161149f565b50505050565b600080836001600160a01b0316836040516115959190611849565b6000604051808303816000865af19150503d80600081146115d2576040519150601f19603f3d011682016040523d82523d6000602084013e6115d7565b606091505b5091509150816116225760405162461bcd60e51b815260206004820152601660248201527514d85999515490cc8c0e8810d0531317d1905253115160521b6044820152606401610770565b805115611574578080602001905181019061163d9190611865565b6115745760405162461bcd60e51b815260206004820152601b60248201527f5361666545524332303a204f5045524154494f4e5f4641494c454400000000006044820152606401610770565b6001600160a01b038116811461169e57600080fd5b50565b6000602082840312156116b357600080fd5b81356105cc81611689565b60005b838110156116d95781810151838201526020016116c1565b50506000910152565b60208152600082518060208401526117018160408501602087016116be565b601f01601f19169190910160400192915050565b6000806040838503121561172857600080fd5b823561173381611689565b946020939093013593505050565b60008060006060848603121561175657600080fd5b833561176181611689565b9250602084013561177181611689565b929592945050506040919091013590565b60006020828403121561179457600080fd5b5035919050565b600080604083850312156117ae57600080fd5b82356117b981611689565b915060208301356117c981611689565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105e4576105e46117d4565b80820281158282048414176105e4576105e46117d4565b60008261183157634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156105e4576105e46117d4565b6000825161185b8184602087016116be565b9190910192915050565b60006020828403121561187757600080fd5b815180151581146105cc57600080fdfea264697066735822122092f84d3812118f9024801ecc04263f5dfdf5b183f40d40280d6abd09a49300f864736f6c63430008110033
Verified Source Code Full Match
Compiler: v0.8.17+commit.8df45f5f
EVM: london
Optimization: Yes (200 runs)
IERC20.sol 27 lines
// SPDX-License-Identifier: -- BCOM --
pragma solidity =0.8.17;
interface IERC20 {
/**
* @dev Interface fo transfer function
*/
function transfer(
address recipient,
uint256 amount
)
external
returns (bool);
/**
* @dev Interface for transferFrom function
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
)
external
returns (bool);
}
SafeERC20.sol 77 lines
// SPDX-License-Identifier: -- BCOM --
pragma solidity =0.8.17;
import "./IERC20.sol";
contract SafeERC20 {
/**
* @dev Allows to execute transfer for a token
*/
function safeTransfer(
IERC20 _token,
address _to,
uint256 _value
)
internal
{
callOptionalReturn(
_token,
abi.encodeWithSelector(
_token.transfer.selector,
_to,
_value
)
);
}
/**
* @dev Allows to execute transferFrom for a token
*/
function safeTransferFrom(
IERC20 _token,
address _from,
address _to,
uint256 _value
)
internal
{
callOptionalReturn(
_token,
abi.encodeWithSelector(
_token.transferFrom.selector,
_from,
_to,
_value
)
);
}
function callOptionalReturn(
IERC20 _token,
bytes memory _data
)
private
{
(
bool success,
bytes memory returndata
) = address(_token).call(_data);
require(
success,
"SafeERC20: CALL_FAILED"
);
if (returndata.length > 0) {
require(
abi.decode(
returndata,
(bool)
),
"SafeERC20: OPERATION_FAILED"
);
}
}
}
SimpleFarm.sol 523 lines
// SPDX-License-Identifier: -- BCOM --
pragma solidity =0.8.17;
import "./TokenWrapper.sol";
contract SimpleFarm is TokenWrapper {
IERC20 public immutable stakeToken;
IERC20 public immutable rewardToken;
uint256 public rewardRate;
uint256 public periodFinished;
uint256 public rewardDuration;
uint256 public lastUpdateTime;
uint256 public perTokenStored;
uint256 constant PRECISION = 1E18;
mapping(address => uint256) public userRewards;
mapping(address => uint256) public perTokenPaid;
address public ownerAddress;
address public proposedOwner;
address public managerAddress;
modifier onlyOwner() {
require(
msg.sender == ownerAddress,
"SimpleFarm: INVALID_OWNER"
);
_;
}
modifier onlyManager() {
require(
msg.sender == managerAddress,
"SimpleFarm: INVALID_MANAGER"
);
_;
}
modifier updateFarm() {
perTokenStored = rewardPerToken();
lastUpdateTime = lastTimeRewardApplicable();
_;
}
modifier updateUser() {
userRewards[msg.sender] = earned(msg.sender);
perTokenPaid[msg.sender] = perTokenStored;
_;
}
modifier updateSender(address sender) {
userRewards[sender] = earned(sender);
perTokenPaid[sender] = perTokenStored;
_;
}
event Staked(
address indexed user,
uint256 tokenAmount
);
event Withdrawn(
address indexed user,
uint256 tokenAmount
);
event RewardAdded(
uint256 rewardRate,
uint256 tokenAmount
);
event RewardPaid(
address indexed user,
uint256 tokenAmount
);
event Recovered(
IERC20 indexed token,
uint256 tokenAmount
);
event RewardsDurationUpdated(
uint256 newRewardDuration
);
event OwnerProposed(
address proposedOwner
);
event OwnerChanged(
address newOwner
);
event ManagerChanged(
address newManager
);
constructor(
IERC20 _stakeToken,
IERC20 _rewardToken,
uint256 _defaultDuration
) {
require(
_defaultDuration > 0,
"SimpleFarm: INVALID_DURATION"
);
stakeToken = _stakeToken;
rewardToken = _rewardToken;
ownerAddress = msg.sender;
managerAddress = msg.sender;
rewardDuration = _defaultDuration;
}
/**
* @dev Tracks timestamp for when reward was applied last time
*/
function lastTimeRewardApplicable()
public
view
returns (uint256 res)
{
res = block.timestamp < periodFinished
? block.timestamp
: periodFinished;
}
/**
* @dev Relative value on reward for single staked token
*/
function rewardPerToken()
public
view
returns (uint256)
{
if (_totalStaked == 0) {
return perTokenStored;
}
uint256 timeFrame = lastTimeRewardApplicable()
- lastUpdateTime;
uint256 extraFund = timeFrame
* rewardRate
* PRECISION
/ _totalStaked;
return perTokenStored
+ extraFund;
}
/**
* @dev Reports earned amount by wallet address not yet collected
*/
function earned(
address _walletAddress
)
public
view
returns (uint256)
{
uint256 difference = rewardPerToken()
- perTokenPaid[_walletAddress];
return _balances[_walletAddress]
* difference
/ PRECISION
+ userRewards[_walletAddress];
}
/**
* @dev Performs deposit of staked token into the farm
*/
function farmDeposit(
uint256 _stakeAmount
)
external
updateFarm()
updateUser()
{
address senderAddress = msg.sender;
_stake(
_stakeAmount,
senderAddress
);
safeTransferFrom(
stakeToken,
senderAddress,
address(this),
_stakeAmount
);
emit Staked(
senderAddress,
_stakeAmount
);
}
/**
* @dev Performs withdrawal of staked token from the farm
*/
function farmWithdraw(
uint256 _withdrawAmount
)
public
updateFarm()
updateUser()
{
if (block.timestamp < periodFinished) {
require(
_totalStaked > _withdrawAmount,
"SimpleFarm: STILL_EARNING"
);
}
address senderAddress = msg.sender;
_withdraw(
_withdrawAmount,
senderAddress
);
safeTransfer(
stakeToken,
senderAddress,
_withdrawAmount
);
emit Withdrawn(
senderAddress,
_withdrawAmount
);
}
/**
* @dev Allows to withdraw staked tokens and claim rewards
*/
function exitFarm()
external
{
uint256 withdrawAmount = _balances[
msg.sender
];
farmWithdraw(
withdrawAmount
);
claimReward();
}
/**
* @dev Allows to claim accumulated rewards up to date
*/
function claimReward()
public
updateFarm()
updateUser()
returns (uint256 rewardAmount)
{
address senderAddress = msg.sender;
rewardAmount = earned(
senderAddress
);
require(
rewardAmount > 0,
"SimpleFarm: NOTHING_TO_CLAIM"
);
userRewards[senderAddress] = 0;
safeTransfer(
rewardToken,
senderAddress,
rewardAmount
);
emit RewardPaid(
senderAddress,
rewardAmount
);
}
/**
* @dev Allows to invoke owner-change procedure
*/
function proposeNewOwner(
address _newOwner
)
external
onlyOwner
{
if (_newOwner == ZERO_ADDRESS) {
revert("SimpleFarm: WRONG_ADDRESS");
}
proposedOwner = _newOwner;
emit OwnerProposed(
_newOwner
);
}
/**
* @dev Finalizes owner-change 2-step procedure
*/
function claimOwnership()
external
{
require(
msg.sender == proposedOwner,
"SimpleFarm: INVALID_CANDIDATE"
);
ownerAddress = proposedOwner;
emit OwnerChanged(
ownerAddress
);
}
/**
* @dev Allows to change manager of the farm
*/
function changeManager(
address _newManager
)
external
onlyOwner
{
if (_newManager == ZERO_ADDRESS) {
revert("SimpleFarm: WRONG_ADDRESS");
}
managerAddress = _newManager;
emit ManagerChanged(
_newManager
);
}
/**
* @dev Allows to recover accidentally sent tokens
* into the farm except stake and reward tokens
*/
function recoverToken(
IERC20 tokenAddress,
uint256 tokenAmount
)
external
{
if (tokenAddress == stakeToken) {
revert("SimpleFarm: INVALID_TOKEN");
}
if (tokenAddress == rewardToken) {
revert("SimpleFarm: INVALID_TOKEN");
}
safeTransfer(
tokenAddress,
ownerAddress,
tokenAmount
);
emit Recovered(
tokenAddress,
tokenAmount
);
}
/**
* @dev Manager sets the cycle duration for distribution
* in seconds and can't be changed during active cycle
*/
function setRewardDuration(
uint256 _rewardDuration
)
external
onlyManager
{
require(
_rewardDuration > 0,
"SimpleFarm: INVALID_DURATION"
);
require(
block.timestamp > periodFinished,
"SimpleFarm: ONGOING_DISTRIBUTION"
);
rewardDuration = _rewardDuration;
emit RewardsDurationUpdated(
_rewardDuration
);
}
/**
* @dev Manager sets reward per second to be distributed
* and invokes initial distribution to be started right away,
* must have some tokens already staked before executing.
*/
function setRewardRate(
uint256 _newRewardRate
)
external
onlyManager
updateFarm()
{
require(
_totalStaked > 0,
"SimpleFarm: NO_STAKERS"
);
require(
_newRewardRate > 0,
"SimpleFarm: INVALID_RATE"
);
uint256 currentPeriodFinish = periodFinished;
lastUpdateTime = block.timestamp;
periodFinished = block.timestamp
+ rewardDuration;
if (block.timestamp < currentPeriodFinish) {
require(
_newRewardRate >= rewardRate,
"SimpleFarm: RATE_CANT_DECREASE"
);
uint256 remainingTime = currentPeriodFinish
- block.timestamp;
uint256 rewardRemains = remainingTime
* rewardRate;
safeTransfer(
rewardToken,
managerAddress,
rewardRemains
);
}
rewardRate = _newRewardRate;
uint256 newRewardAmount = rewardDuration
* _newRewardRate;
safeTransferFrom(
rewardToken,
managerAddress,
address(this),
newRewardAmount
);
emit RewardAdded(
_newRewardRate,
newRewardAmount
);
}
/**
* @dev Allows to transfer receipt tokens
*/
function transfer(
address _recipient,
uint256 _amount
)
external
updateFarm()
updateUser()
updateSender(_recipient)
returns (bool)
{
_transfer(
msg.sender,
_recipient,
_amount
);
return true;
}
/**
* @dev Allows to transfer receipt tokens on owner's behalf
*/
function transferFrom(
address _sender,
address _recipient,
uint256 _amount
)
external
updateFarm()
updateSender(_sender)
updateSender(_recipient)
returns (bool)
{
if (_allowances[_sender][msg.sender] != type(uint256).max) {
_allowances[_sender][msg.sender] -= _amount;
}
_transfer(
_sender,
_recipient,
_amount
);
return true;
}
}
TokenWrapper.sol 218 lines
// SPDX-License-Identifier: -- BCOM --
pragma solidity =0.8.17;
import "./SafeERC20.sol";
contract TokenWrapper is SafeERC20 {
string public constant name = "VerseFarm";
string public constant symbol = "VFARM";
uint8 public constant decimals = 18;
uint256 _totalStaked;
mapping(address => uint256) _balances;
mapping(address => mapping(address => uint256)) _allowances;
address constant ZERO_ADDRESS = address(0x0);
event Transfer(
address indexed from,
address indexed to,
uint256 value
);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
/**
* @dev Returns total amount of staked tokens
*/
function totalSupply()
external
view
returns (uint256)
{
return _totalStaked;
}
/**
* @dev Returns staked amount by wallet address
*/
function balanceOf(
address _walletAddress
)
external
view
returns (uint256)
{
return _balances[_walletAddress];
}
/**
* @dev Increases staked amount by wallet address
*/
function _stake(
uint256 _amount,
address _address
)
internal
{
_totalStaked =
_totalStaked + _amount;
unchecked {
_balances[_address] =
_balances[_address] + _amount;
}
emit Transfer(
ZERO_ADDRESS,
_address,
_amount
);
}
/**
* @dev Decreases total staked amount
*/
function _withdraw(
uint256 _amount,
address _address
)
internal
{
unchecked {
_totalStaked =
_totalStaked - _amount;
}
_balances[_address] =
_balances[_address] - _amount;
emit Transfer(
_address,
ZERO_ADDRESS,
_amount
);
}
/**
* @dev Updates balances during transfer
*/
function _transfer(
address _sender,
address _recipient,
uint256 _amount
)
internal
{
_balances[_sender] =
_balances[_sender] - _amount;
unchecked {
_balances[_recipient] =
_balances[_recipient] + _amount;
}
emit Transfer(
_sender,
_recipient,
_amount
);
}
/**
* @dev Grants permission for receipt tokens transfer on owner's behalf
*/
function approve(
address _spender,
uint256 _amount
)
external
returns (bool)
{
_approve(
msg.sender,
_spender,
_amount
);
return true;
}
/**
* @dev Checks value for receipt tokens transfer on owner's behalf
*/
function allowance(
address _owner,
address _spender
)
external
view
returns (uint256)
{
return _allowances[_owner][_spender];
}
/**
* @dev Allowance update for receipt tokens transfer on owner's behalf
*/
function _approve(
address _owner,
address _spender,
uint256 _amount
)
internal
{
_allowances[_owner][_spender] = _amount;
emit Approval(
_owner,
_spender,
_amount
);
}
/**
* @dev Increases value for receipt tokens transfer on owner's behalf
*/
function increaseAllowance(
address _spender,
uint256 _addedValue
)
external
returns (bool)
{
_approve(
msg.sender,
_spender,
_allowances[msg.sender][_spender] + _addedValue
);
return true;
}
/**
* @dev Decreases value for receipt tokens transfer on owner's behalf
*/
function decreaseAllowance(
address _spender,
uint256 _subtractedValue
)
external
returns (bool)
{
_approve(
msg.sender,
_spender,
_allowances[msg.sender][_spender] - _subtractedValue
);
return true;
}
}
Read Contract
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
earned 0x008cc262 → uint256
lastTimeRewardApplicable 0x80faa57d → uint256
lastUpdateTime 0xc8f33c91 → uint256
managerAddress 0xcf73a1bc → address
name 0x06fdde03 → string
ownerAddress 0x8f84aa09 → address
perTokenPaid 0xa4c0ae6f → uint256
perTokenStored 0xee6c0d57 → uint256
periodFinished 0x0962c4f9 → uint256
proposedOwner 0xd153b60c → address
rewardDuration 0xf520e7e5 → uint256
rewardPerToken 0xcd3daf9d → uint256
rewardRate 0x7b0a47ee → uint256
rewardToken 0xf7c618c1 → address
stakeToken 0x51ed6a30 → address
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
userRewards 0x0660f1e8 → uint256
Write Contract 15 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address _spender
uint256 _amount
returns: bool
changeManager 0xa3fbbaae
address _newManager
claimOwnership 0x4e71e0c8
No parameters
claimReward 0xb88a802f
No parameters
returns: uint256
decreaseAllowance 0xa457c2d7
address _spender
uint256 _subtractedValue
returns: bool
exitFarm 0xcddaf358
No parameters
farmDeposit 0x90717dd3
uint256 _stakeAmount
farmWithdraw 0x2b8c8a64
uint256 _withdrawAmount
increaseAllowance 0x39509351
address _spender
uint256 _addedValue
returns: bool
proposeNewOwner 0xb1f8100d
address _newOwner
recoverToken 0xb29a8140
address tokenAddress
uint256 tokenAmount
setRewardDuration 0xc0ed00c9
uint256 _rewardDuration
setRewardRate 0x9e447fc6
uint256 _newRewardRate
transfer 0xa9059cbb
address _recipient
uint256 _amount
returns: bool
transferFrom 0x23b872dd
address _sender
address _recipient
uint256 _amount
returns: bool
Recent Transactions
No transactions found for this address