Address Contract Verified
Address
0x858cae2B405241D518c419A71e34AEdB75974cb6
Balance
0 ETH
Nonce
1
Code Size
4697 bytes
Creator
0x35F3FA4B...883E at tx 0xf6e78793...7c21e7
Indexed Transactions
0
Contract Bytecode
4697 bytes
0x60406080815260048036101561001457600080fd5b600090813560e01c806318e4c2ea14610c9757806320d3a0b414610c7857806325d5971f14610b5b578063270a0c3314610b305780632dc075e114610a255780632e43d0681461091b57806347535d7b14610a0157806355f6b7d3146109e25780635e9425561461093a57806368c336271461091b57806370f64552146108ef578063715018a61461089557806372f702f31461086c57806379fbcf67146107a45780638af92c93146107785780638da5cb5b14610750578063963c9dd314610668578063a100d69d1461062e578063b6f668c11461060d578063cec534d6146103b8578063d2d7231f14610390578063d5a44f861461030c578063ec342ad0146102ef578063f2fde38b14610267578063f301af421461023a5763fe4b84df1461013e57600080fd5b34610236576020366003190112610236576101576111f7565b60ff600954166101fd5760015483516323b872dd60e01b815233838201908152306020808301919091529335604082015293949093909291849182900360600190829087906001600160a01b03165af19081156101f457506101c5575b50600160ff19600954161760095580f35b6101e69060203d6020116101ed575b6101de8183610e07565b81019061102e565b50386101b4565b503d6101d4565b513d84823e3d90fd5b606490602084519162461bcd60e51b83528201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152fd5b5080fd5b50829034610263576020366003190112610263576020928291358152600b845220549051908152f35b8280fd5b5082903461026357602036600319011261026357610283610ccc565b9061028c6111f7565b6001600160a01b039182169283156102d957505082546001600160a01b0319811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b51631e4fbdf760e01b8152908101849052602490fd5b828434610236578160031936011261023657602090516103e88152f35b508290346102635760203660031901126102635780359260075484101561038d575061033960e093610d9d565b50805492600182015492600283015460018060a01b03600385015416918401549260ff600660058701549601541695815197885260208801528601526060850152608084015260a0830152151560c0820152f35b80fd5b5091903461038d57602036600319011261038d57506103b1602092356110cf565b9051908152f35b509134610236576060366003190112610236578235906024356001600160a01b0381811691829003610609576044359160ff60095416156105cb578415610590576008549084519061040982610dd5565b868252602082019242845286830191868352606084019081526080840191825260a08401928a845260c08501958b8752600754600160401b81101561057c578060016104589201600755610d9d565b96909661056957936006936104fc9d9e979360209a97938e9a97518655516001860155516002850155866003850191511660018060a01b03198254161790555186830155516005820155019051151560ff801983541691161790556104be600854610e87565b60085560015486516323b872dd60e01b815233938101938452306020850152604084019490945292978893919091169183918a918391606090910190565b03925af193841561055f577f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159394610540575b50815193845260208401523392a280f35b6105589060203d6020116101ed576101de8183610e07565b503861052f565b82513d87823e3d90fd5b50634e487b7160e01b8c528b8d5260248cfd5b50634e487b7160e01b8c5260418d5260248cfd5b835162461bcd60e51b8152602081890152601560248201527443616e6e6f74207374616b65203020746f6b656e7360581b6044820152606490fd5b835162461bcd60e51b815260208189015260186024820152775374616b696e67206973206e6f7420617661696c61626c6560401b6044820152606490fd5b8480fd5b5091903461038d57602036600319011261038d57506103b160209235611066565b5082903461026357602036600319011261026357359160055483101561038d575061065a602092610d82565b91905490519160031b1c8152f35b508290346102635760203660031901126102635760e09260c0835161068c81610dd5565b82815282602082015282858201528260608201528260808201528260a082015201526106b88135610d9d565b508251916106c583610dd5565b8154938484526001830154916020850192835260028401549180860192835260018060a01b0392836003870154169260608801938452860154946080880195865260c060ff600660058a01549960a08c019a8b520154169801971515885282519889525160208901525190870152511660608501525160808401525160a083015251151560c0820152f35b828434610236578160031936011261023657905490516001600160a01b039091168152602090f35b5082903461026357602036600319011261026357359160025483101561038d575061065a602092610d4c565b828434610236576020366003190112610236576107c76107c2610ccc565b610eac565b916107d28351610e41565b926107dd8151610e41565b915b815181101561084157806107fe6107f860019385610e73565b51611066565b6108088288610e73565b52610829600261082161081b8487610e73565b51610d9d565b500154610d67565b90549060031b1c61083a8286610e73565b52016107df565b50506108689061085a8351948486958652850190610ce7565b908382036020850152610ce7565b0390f35b82843461023657816003193601126102365760015490516001600160a01b039091168152602090f35b823461038d578060031936011261038d576108ae6111f7565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5082903461026357602036600319011261026357359160065483101561038d575061065a602092610d67565b8284346102365781600319360112610236576020906008549051908152f35b5082903461026357816003193601126102635760207f8ce05602d1ff500bc65f3b2549f014d9121ab118a5bdb6d0606324af7c29a9a89135926024359085600561098387610d9d565b5061099560ff60068301541615610f4d565b6109ac60018060a01b036003830154163314610f93565b6109d66109b8896110cf565b6109c3811515610fd5565b8660028401554260018401558254611021565b8155015551908152a280f35b828434610236578160031936011261023657602090600a549051908152f35b82843461023657816003193601126102365760209060ff6009541690519015158152f35b5082903461026357602036600319011261026357610a438135610d9d565b5091610a5660ff60068501541615610f4d565b610a6d60018060a01b036003850154163314610f93565b60058301928354610af2576002610a88600183015442611046565b91015480610a98575b4285558580f35b610aa190610d4c565b90549060031b1c1015610ab5578080610a91565b906020606492519162461bcd60e51b83528201526017602482015276131bd8dac81c195c9a5bd9081b9bdd081c995858da1959604a1b6044820152fd5b815162461bcd60e51b81526020818501526018602482015277155b9b1bd8dac8185b1c9958591e481a5b9a5d1a585d195960421b6044820152606490fd5b5091903461038d57602036600319011261038d578235925483101561038d575061065a602092610d1b565b50823461026357602080600319360112610c7457600183359282610b7e85610d9d565b50956044610bdb600689016003815491610b9b60ff841615610f4d565b610bb28c8a8060a01b039384910154163314610f93565b610bbb8b6110cf565b988993610bc9851515610fd5565b60ff1916179055600154169954611021565b91898551998a94859363a9059cbb60e01b8552339085015260248401525af1948515610c6a577f56ca301a9219608c91e7bcee90e083c19671d2cdcc96752c7af291cee5f9c8c89495610c4d575b50848652600b83528181872055610c4282600a54611021565b600a5551908152a280f35b610c6390843d86116101ed576101de8183610e07565b5086610c29565b81513d88823e3d90fd5b8380fd5b8284346102365781600319360112610236576020906003549051908152f35b8284346102365760203660031901126102365761086890610cb96107c2610ccc565b9051918291602083526020830190610ce7565b600435906001600160a01b0382168203610ce257565b600080fd5b90815180825260208080930193019160005b828110610d07575050505090565b835185529381019392810192600101610cf9565b600454811015610d3657600460005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b600254811015610d3657600260005260206000200190600090565b600654811015610d3657600660005260206000200190600090565b600554811015610d3657600560005260206000200190600090565b600754811015610d36576007600081815291027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880191565b60e0810190811067ffffffffffffffff821117610df157604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610df157604052565b67ffffffffffffffff8111610df15760051b60200190565b90610e4b82610e29565b610e586040519182610e07565b8281528092610e69601f1991610e29565b0190602036910137565b8051821015610d365760209160051b010190565b6000198114610e965760010190565b634e487b7160e01b600052601160045260246000fd5b9060085491610eba83610e41565b92600091825b828110610f0457505050610ed381610e41565b9060005b818110610ee5575090925050565b80610ef260019287610e73565b51610efd8286610e73565b5201610ed7565b6003610f0f82610d9d565b5001546001600160a01b03838116911614610f2d575b600101610ec0565b92610f458185610f3f6001948a610e73565b52610e87565b939050610f25565b15610f5457565b60405162461bcd60e51b815260206004820152601760248201527629ba30b5b29030b63932b0b23c903bb4ba34323930bbb760491b6044820152606490fd5b15610f9a57565b60405162461bcd60e51b81526020600482015260136024820152722737ba103a34329039ba30b5b29037bbb732b960691b6044820152606490fd5b15610fdc57565b60405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742072657761726420616d6f756e740000000000006044820152606490fd5b91908201809211610e9657565b90816020910312610ce257518015158103610ce25790565b91908203918211610e9657565b81810292918115918404141715610e9657565b61106f90610d9d565b5054600554600091825b8281106110865750505090565b61108f81610d82565b90549060031b1c633b9aca0090818102918183041490151715610e96578210156110bc575b600101611079565b925060018301808411610e9657926110b4565b6110d890610d9d565b5060ff6006820154166111f1576005810154906110f58242611046565b916003548093101590816111e7575b50156111a65761116360028201549261113a61111f85610d4c565b90549060031b1c91611135600186015442611046565b611046565b92841561119e575b61115061115d915495610d1b565b90549060031b1c82611053565b92611046565b9160045415610d365761119461119a9261118e640757b12c0095600460005260206000205490611053565b90611021565b90611053565b0490565b839150611142565b60405162461bcd60e51b81526020600482015260196024820152781b9bdd081c995858da1959081d5b9b1bd8dac81c195c9a5bd9603a1b6044820152606490fd5b9050151538611104565b50600090565b6000546001600160a01b0316330361120b57565b60405163118cdaa760e01b8152336004820152602490fdfea264697066735822122067f0979db28020c14c6af3d7639649d0deb3fee5e8b37683cbfff115106a68a864736f6c63430008180033
Verified Source Code Full Match
Compiler: v0.8.24+commit.e11b9ed9
EVM: paris
Optimization: Yes (100 runs)
NewStaking.sol 273 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title Staking Contract
* @dev A staking contract that allows users to stake ERC20 tokens and earn rewards based on staking duration and tier.
* The contract supports multiple staking periods, APRs, and tiers with multipliers for rewards.
*/
contract Staking is Ownable {
IERC20 public stakingToken; // The ERC20 token used for staking
struct Stake {
uint256 tokenAmount; // Amount of tokens staked
uint256 startTime; // Timestamp when staking started
uint256 stakingType; // Type of staking (0 = flexible, 1+ = locked)
address user; // Address of the staker
uint256 id; // Unique ID of the stake
uint256 unlockStartTime; // Timestamp when unlock was initiated
bool finished; // Whether the stake is withdrawn
}
// Staking periods in days (0 = flexible, 1 = 1 month, 3 = 3 months, etc.)
uint256[] public stakingPeriods = [
0 days,
1 * 30 days,
3 * 30 days,
6 * 30 days,
12 * 30 days
];
// unlock period
uint256 public unlockPeriod = 7 days;
// Annual Percentage Rates (APR) for each staking type
uint256[] public stakingAPRs = [30, 42, 60, 90, 120];
// Tier thresholds for launchpad eligibility
uint256[] public tierThresholds = [
1000,
5000,
20000,
50000,
100000,
250000
];
// Multipliers for staking types (used for launchpad tier calculation)
uint256[] public stakingMultipliers = [0, 10, 12, 15, 20];
uint256 public constant BASE = 1000; // Base value for APR calculations
Stake[] public stakes; // Array of all stakes
uint256 public totalNumberOfStakes; // Total number of stakes created
bool public isOpen; // Whether staking is open
uint256 public totalPaidRewards; // Total paid rewards
mapping(uint256 => uint256) public rewards; // Mapping of stake ID to reward amount
event Deposit(address indexed user, uint256 amount, uint256 stakingType);
event Withdraw(uint256 indexed id, uint256 rewardAmount);
event Restake(uint256 indexed id, uint256 stakingType);
/**
* @dev Constructor to initialize the staking contract.
* @param _stakingToken Address of the ERC20 token used for staking.
*/
constructor(address _stakingToken) Ownable(msg.sender) {
stakingToken = IERC20(_stakingToken);
totalNumberOfStakes = 0;
}
/**
* @dev Initializes the staking contract by transferring tokens to the contract.
* @param _amount Amount of tokens to transfer.
*/
function initialize(uint256 _amount) external onlyOwner {
require(!isOpen, "Already initialized");
stakingToken.transferFrom(msg.sender, address(this), _amount);
isOpen = true;
}
/**
* @dev Allows a user to stake tokens.
* @param _amount Amount of tokens to stake.
* @param _stakingType Type of staking (0 = flexible, 1+ = locked).
*/
function stakeTokens(uint256 _amount, address _user, uint256 _stakingType) external {
require(isOpen, "Staking is not available");
require(_amount > 0, "Cannot stake 0 tokens");
stakes.push(
Stake({
tokenAmount: _amount,
startTime: block.timestamp,
stakingType: _stakingType,
user: _user,
id: totalNumberOfStakes,
unlockStartTime: 0,
finished: false
})
);
totalNumberOfStakes++;
stakingToken.transferFrom(msg.sender, address(this), _amount);
emit Deposit(msg.sender, _amount, _stakingType);
}
/**
* @dev Initiates the unlock process for a locked stake.
* @param _id ID of the stake to unlock.
*/
function initiateUnlock(uint256 _id) external {
Stake storage stake = stakes[_id];
require(!stake.finished, "Stake already withdrawn");
require(stake.user == msg.sender, "Not the stake owner");
require(stake.unlockStartTime == 0, "Unlock already initiated");
uint256 stakingDuration = block.timestamp - stake.startTime;
if (stake.stakingType != 0) {
require(
stakingDuration > stakingPeriods[stake.stakingType],
"Lock period not reached"
);
}
stake.unlockStartTime = block.timestamp;
}
/**
* @dev Allows a user to withdraw their stake and rewards.
* @param _id ID of the stake to withdraw.
*/
function withdrawStake(uint256 _id) external {
Stake storage stake = stakes[_id];
require(!stake.finished, "Stake already withdrawn");
require(stake.user == msg.sender, "Not the stake owner");
uint256 rewardAmount = calculateReward(_id);
require(rewardAmount > 0, "Insufficient reward amount");
stake.finished = true;
stakingToken.transfer(msg.sender, stake.tokenAmount + rewardAmount);
rewards[_id] = rewardAmount;
totalPaidRewards += rewardAmount;
emit Withdraw(_id, rewardAmount);
}
/**
* @dev Allows a user to restake their rewards into a new stake.
* @param _id ID of the stake to restake.
* @param _stakingType New staking type for the restake.
*/
function restakeRewards(uint256 _id, uint256 _stakingType) external {
Stake storage stake = stakes[_id];
require(!stake.finished, "Stake already withdrawn");
require(stake.user == msg.sender, "Not the stake owner");
uint256 rewardAmount = calculateReward(_id);
require(rewardAmount > 0, "Insufficient reward amount");
stake.stakingType = _stakingType;
stake.startTime = block.timestamp;
stake.tokenAmount += rewardAmount;
stake.unlockStartTime = 0;
emit Restake(_id, _stakingType);
}
/**
* @dev Returns the list of stake IDs owned by a specific address.
* @param _owner Address of the staker.
* @return Array of stake IDs.
*/
function getStakeIdsByOwner(
address _owner
) public view returns (uint256[] memory) {
uint256[] memory ids = new uint256[](totalNumberOfStakes);
uint256 count = 0;
for (uint256 i = 0; i < totalNumberOfStakes; i++) {
Stake storage stake = stakes[i];
if (stake.user == _owner) {
ids[count] = i;
count++;
}
}
uint256[] memory result = new uint256[](count);
for (uint256 j = 0; j < count; j++) {
result[j] = ids[j];
}
return result;
}
/**
* @dev Returns the Launchpad tiers and multipliers for all stakes owned by a specific address.
* @param _owner The address of the staker.
* @return tiers An array of tiers corresponding to each stake.
* @return multipliers An array of multipliers corresponding to each stake.
*/
function getLaunchpadTiersByOwner(
address _owner
)
public
view
returns (uint256[] memory tiers, uint256[] memory multipliers)
{
uint256[] memory ids = getStakeIdsByOwner(_owner);
tiers = new uint256[](ids.length);
multipliers = new uint256[](ids.length);
for (uint256 i = 0; i < ids.length; i++) {
tiers[i] = calculateLaunchpadTier(ids[i]);
uint256 stakingType = stakes[ids[i]].stakingType;
multipliers[i] = stakingMultipliers[stakingType];
}
return (tiers, multipliers);
}
/**
* @dev Calculates the launchpad tier for a specific stake.
* @param _id ID of the stake.
* @return Tier level (0 = no tier, 1+ = tier level).
*/
function calculateLaunchpadTier(uint256 _id) public view returns (uint256) {
Stake storage stake = stakes[_id];
uint256 amount = stake.tokenAmount;
uint256 tier = 0;
for (uint256 i = 0; i < tierThresholds.length; i++) {
if (amount >= tierThresholds[i] * 10 ** 9) {
tier = i + 1;
}
}
return tier;
}
/**
* @dev Calculates the reward for a specific stake.
* @param _id ID of the stake.
* @return Reward amount.
*/
function calculateReward(uint256 _id) public view returns (uint256) {
Stake storage stake = stakes[_id];
if (stake.finished) return 0;
require(block.timestamp - stake.unlockStartTime >= unlockPeriod && stake.unlockStartTime > 0, "not reached unlock period");
uint256 rewardTime = stakingPeriods[stake.stakingType];
uint256 stakingDuration = block.timestamp - stake.startTime - unlockPeriod;
if (stake.stakingType == 0) {
rewardTime = stakingDuration;
}
return
(stake.tokenAmount *
(rewardTime *
stakingAPRs[stake.stakingType] +
(stakingDuration - rewardTime) *
stakingAPRs[0])) / (365 days * BASE);
}
/**
* @dev Returns the total number of stakes in the contract.
* @return Total number of stakes.
*/
function getTotalStakes() public view returns (uint256) {
return totalNumberOfStakes;
}
/**
* @dev Returns the details of a specific stake.
* @param _id ID of the stake.
* @return Stake details.
*/
function getStakeDetails(uint256 _id) public view returns (Stake memory) {
return stakes[_id];
}
}
Ownable.sol 100 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^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.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed 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.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
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.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
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) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
IERC20.sol 79 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed 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.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (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.
*/
function transfer(address to, uint256 value) external returns (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.
*/
function allowance(address owner, address spender) external view returns (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.
*/
function approve(address spender, uint256 value) external returns (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.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
Context.sol 28 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^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.
*/
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;
}
}
Read Contract
BASE 0xec342ad0 → uint256
calculateLaunchpadTier 0xb6f668c1 → uint256
calculateReward 0xd2d7231f → uint256
getLaunchpadTiersByOwner 0x79fbcf67 → uint256[], uint256[]
getStakeDetails 0x963c9dd3 → tuple
getStakeIdsByOwner 0x18e4c2ea → uint256[]
getTotalStakes 0x68c33627 → uint256
isOpen 0x47535d7b → bool
owner 0x8da5cb5b → address
rewards 0xf301af42 → uint256
stakes 0xd5a44f86 → uint256, uint256, uint256, address, uint256, uint256, bool
stakingAPRs 0x270a0c33 → uint256
stakingMultipliers 0x70f64552 → uint256
stakingPeriods 0x8af92c93 → uint256
stakingToken 0x72f702f3 → address
tierThresholds 0xa100d69d → uint256
totalNumberOfStakes 0x2e43d068 → uint256
totalPaidRewards 0x55f6b7d3 → uint256
unlockPeriod 0x20d3a0b4 → uint256
Write Contract 7 functions
These functions modify contract state and require a wallet transaction to execute.
initialize 0xfe4b84df
uint256 _amount
initiateUnlock 0x2dc075e1
uint256 _id
renounceOwnership 0x715018a6
No parameters
restakeRewards 0x5e942556
uint256 _id
uint256 _stakingType
stakeTokens 0xcec534d6
uint256 _amount
address _user
uint256 _stakingType
transferOwnership 0xf2fde38b
address newOwner
withdrawStake 0x25d5971f
uint256 _id
Recent Transactions
No transactions found for this address