Address Contract Partially Verified
Address
0x588634Ae334Bb11A4E1A6e6f3b689a11b48D8605
Balance
0 ETH
Nonce
1
Code Size
6079 bytes
Creator
0xf81E8ab8...6E06 at tx 0xe6bae737...795056
Indexed Transactions
0
Contract Bytecode
6079 bytes
0x608060405234801561000f575f80fd5b50600436106100fe575f3560e01c8063939d623711610095578063e3161ddd11610064578063e3161ddd14610266578063e35e5d8414610270578063f2fde38b1461028e578063f40f0f52146102aa576100fe565b8063939d6237146101f0578063a694fc3a1461020e578063aaf5eb681461022a578063c046371114610248576100fe565b80635312ea8e116100d15780635312ea8e1461017a578063680be5f414610196578063817b1cd2146101b45780638da5cb5b146101d2576100fe565b80630deb1ddf1461010257806316934fc4146101205780632e17de78146101545780634e71d92d14610170575b5f80fd5b61010a6102da565b604051610117919061119a565b60405180910390f35b61013a600480360381019061013591906111f2565b6102fe565b60405161014b959493929190611235565b60405180910390f35b61016e600480360381019061016991906112b0565b610330565b005b610178610691565b005b610194600480360381019061018f91906112b0565b6108b9565b005b61019e6109e5565b6040516101ab91906112db565b60405180910390f35b6101bc610a9b565b6040516101c991906112db565b60405180910390f35b6101da610aa1565b6040516101e79190611303565b60405180910390f35b6101f8610ac4565b60405161020591906112db565b60405180910390f35b610228600480360381019061022391906112b0565b610aca565b005b610232610de9565b60405161023f91906112db565b60405180910390f35b610250610df5565b60405161025d91906112db565b60405180910390f35b61026e610dfb565b005b610278610eab565b60405161028591906112db565b60405180910390f35b6102a860048036038101906102a391906111f2565b610eb2565b005b6102c460048036038101906102bf91906111f2565b610f81565b6040516102d191906112db565b60405180910390f35b7f000000000000000000000000de860ac02d0f22363da499577ca7894afd8c98b481565b6001602052805f5260405f205f91509050805f0154908060010154908060020154908060030154908060040154905085565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905081815f015410156103b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ad90611376565b60405180910390fd5b6201518081600401546103c991906113c1565b42101561040b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104029061143e565b60405180910390fd5b610413610dfb565b5f8160010154670de0b6b3a7640000600354845f0154610433919061145c565b61043d91906114ca565b61044791906114fa565b90505f81111561053c577f000000000000000000000000de860ac02d0f22363da499577ca7894afd8c98b473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016104ac92919061152d565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190611589565b503373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a8260405161053391906112db565b60405180910390a25b82825f015f82825461054e91906114fa565b92505081905550670de0b6b3a7640000600354835f015461056f919061145c565b61057991906114ca565b82600101819055508260025f82825461059291906114fa565b925050819055504282600401819055507f000000000000000000000000de860ac02d0f22363da499577ca7894afd8c98b473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b81526004016105fd92919061152d565b6020604051808303815f875af1158015610619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063d9190611589565b503373ffffffffffffffffffffffffffffffffffffffff167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f758460405161068491906112db565b60405180910390a2505050565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015411610716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070d906115fe565b60405180910390fd5b61071e610dfb565b5f8160010154670de0b6b3a7640000600354845f015461073e919061145c565b61074891906114ca565b61075291906114fa565b90505f8111610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078d90611666565b60405180910390fd5b670de0b6b3a7640000600354835f01546107b0919061145c565b6107ba91906114ca565b82600101819055504282600301819055507f000000000000000000000000de860ac02d0f22363da499577ca7894afd8c98b473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161082692919061152d565b6020604051808303815f875af1158015610842573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108669190611589565b503373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a826040516108ad91906112db565b60405180910390a25050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d906116ce565b60405180910390fd5b7f000000000000000000000000de860ac02d0f22363da499577ca7894afd8c98b473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016109a192919061152d565b6020604051808303815f875af11580156109bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e19190611589565b5050565b5f80600254036109ff57670429d069189e00009050610a98565b5f6a52b7d2dcc80cd2e4000000670de0b6b3a7640000600254610a22919061145c565b610a2c91906114ca565b90505f610a38826110b4565b90505f6a17293b0a9e69fd9c00000090505f8282610a5691906114ca565b90505f6638d7ea4c68000090505f8183610a7091906113c1565b9050670429d069189e0000811115610a8e57670429d069189e000090505b8096505050505050505b90565b60025481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b5f8111610b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0390611736565b60405180910390fd5b610b14610dfb565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f01541115610c8a575f8160010154670de0b6b3a7640000600354845f0154610b7f919061145c565b610b8991906114ca565b610b9391906114fa565b90505f811115610c88577f000000000000000000000000de860ac02d0f22363da499577ca7894afd8c98b473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610bf892919061152d565b6020604051808303815f875af1158015610c14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c389190611589565b503373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a82604051610c7f91906112db565b60405180910390a25b505b7f000000000000000000000000de860ac02d0f22363da499577ca7894afd8c98b473ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610ce793929190611754565b6020604051808303815f875af1158015610d03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d279190611589565b5081815f015f828254610d3a91906113c1565b92505081905550670de0b6b3a7640000600354825f0154610d5b919061145c565b610d6591906114ca565b81600101819055504281600201819055504281600301819055508160025f828254610d9091906113c1565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83604051610ddd91906112db565b60405180910390a25050565b670de0b6b3a764000081565b60045481565b60045442111580610e0d57505f600254145b610ea9575f60045442610e2091906114fa565b90505f670de0b6b3a76400006301e1338083600254610e3d6109e5565b610e47919061145c565b610e51919061145c565b610e5b91906114ca565b610e6591906114ca565b9050600254670de0b6b3a764000082610e7e919061145c565b610e8891906114ca565b60035f828254610e9891906113c1565b925050819055504260048190555050505b565b6201518081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f36906116ce565b60405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015403610fd5575f9150506110af565b5f600354905060045442118015610fed57505f600254115b15611079575f6004544261100191906114fa565b90505f670de0b6b3a76400006301e133808360025461101e6109e5565b611028919061145c565b611032919061145c565b61103c91906114ca565b61104691906114ca565b9050600254670de0b6b3a76400008261105f919061145c565b61106991906114ca565b8361107491906113c1565b925050505b8160010154670de0b6b3a764000082845f0154611096919061145c565b6110a091906114ca565b6110aa91906114fa565b925050505b919050565b5f8082036110c4575f905061111b565b5f60026001846110d491906113c1565b6110de91906114ca565b90508291505b818110156111195780915060028182856110fe91906114ca565b61110891906113c1565b61111291906114ca565b90506110e4565b505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61116261115d61115884611120565b61113f565b611120565b9050919050565b5f61117382611148565b9050919050565b5f61118482611169565b9050919050565b6111948161117a565b82525050565b5f6020820190506111ad5f83018461118b565b92915050565b5f80fd5b5f6111c182611120565b9050919050565b6111d1816111b7565b81146111db575f80fd5b50565b5f813590506111ec816111c8565b92915050565b5f60208284031215611207576112066111b3565b5b5f611214848285016111de565b91505092915050565b5f819050919050565b61122f8161121d565b82525050565b5f60a0820190506112485f830188611226565b6112556020830187611226565b6112626040830186611226565b61126f6060830185611226565b61127c6080830184611226565b9695505050505050565b61128f8161121d565b8114611299575f80fd5b50565b5f813590506112aa81611286565b92915050565b5f602082840312156112c5576112c46111b3565b5b5f6112d28482850161129c565b91505092915050565b5f6020820190506112ee5f830184611226565b92915050565b6112fd816111b7565b82525050565b5f6020820190506113165f8301846112f4565b92915050565b5f82825260208201905092915050565b7f4e6f7420656e6f756768207374616b65640000000000000000000000000000005f82015250565b5f61136060118361131c565b915061136b8261132c565b602082019050919050565b5f6020820190508181035f83015261138d81611354565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6113cb8261121d565b91506113d68361121d565b92508282019050808211156113ee576113ed611394565b5b92915050565b7f556e7374616b6520636f6f6c646f776e3a20323468206e6f74207061737365645f82015250565b5f61142860208361131c565b9150611433826113f4565b602082019050919050565b5f6020820190508181035f8301526114558161141c565b9050919050565b5f6114668261121d565b91506114718361121d565b925082820261147f8161121d565b9150828204841483151761149657611495611394565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6114d48261121d565b91506114df8361121d565b9250826114ef576114ee61149d565b5b828204905092915050565b5f6115048261121d565b915061150f8361121d565b925082820390508181111561152757611526611394565b5b92915050565b5f6040820190506115405f8301856112f4565b61154d6020830184611226565b9392505050565b5f8115159050919050565b61156881611554565b8114611572575f80fd5b50565b5f815190506115838161155f565b92915050565b5f6020828403121561159e5761159d6111b3565b5b5f6115ab84828501611575565b91505092915050565b7f4e6f7468696e6720746f20636c61696d000000000000000000000000000000005f82015250565b5f6115e860108361131c565b91506115f3826115b4565b602082019050919050565b5f6020820190508181035f830152611615816115dc565b9050919050565b7f4e6f2072657761726400000000000000000000000000000000000000000000005f82015250565b5f61165060098361131c565b915061165b8261161c565b602082019050919050565b5f6020820190508181035f83015261167d81611644565b9050919050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f6116b8600e8361131c565b91506116c382611684565b602082019050919050565b5f6020820190508181035f8301526116e5816116ac565b9050919050565b7f43616e6e6f74207374616b6520300000000000000000000000000000000000005f82015250565b5f611720600e8361131c565b915061172b826116ec565b602082019050919050565b5f6020820190508181035f83015261174d81611714565b9050919050565b5f6060820190506117675f8301866112f4565b61177460208301856112f4565b6117816040830184611226565b94935050505056fea2646970667358221220ad12a74c66a320939455e8b6fa9f6989dc12aee59ec53bc7dc65d1195985422864736f6c63430008150033
Verified Source Code Partial Match
Compiler: v0.8.21+commit.d9974bed
EVM: shanghai
Optimization: No
NRXStaking.sol 165 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}
contract NRXStaking {
IERC20 public immutable nrx;
address public owner;
struct StakeInfo {
uint256 amount;
uint256 rewardDebt;
uint256 depositTime;
uint256 lastClaimTime;
uint256 lastUnstakeTime;
}
mapping(address => StakeInfo) public stakes;
uint256 public totalStaked;
uint256 public accRewardPerShare;
uint256 public lastUpdate;
uint256 public constant UNSTAKE_DELAY = 1 days;
uint256 public constant PRECISION = 1e18;
event Staked(address indexed user, uint256 amount);
event Unstaked(address indexed user, uint256 amount);
event Claimed(address indexed user, uint256 reward);
modifier onlyOwner() {
require(msg.sender == owner, "Not authorized");
_;
}
constructor(IERC20 _nrx) {
nrx = _nrx;
owner = msg.sender;
lastUpdate = block.timestamp;
}
function stake(uint256 amount) external {
require(amount > 0, "Cannot stake 0");
updatePool();
StakeInfo storage user = stakes[msg.sender];
if (user.amount > 0) {
uint256 pending = (user.amount * accRewardPerShare / PRECISION) - user.rewardDebt;
if (pending > 0) {
nrx.transfer(msg.sender, pending);
emit Claimed(msg.sender, pending);
}
}
nrx.transferFrom(msg.sender, address(this), amount);
user.amount += amount;
user.rewardDebt = user.amount * accRewardPerShare / PRECISION;
user.depositTime = block.timestamp;
user.lastClaimTime = block.timestamp;
totalStaked += amount;
emit Staked(msg.sender, amount);
}
function unstake(uint256 amount) external {
StakeInfo storage user = stakes[msg.sender];
require(user.amount >= amount, "Not enough staked");
require(block.timestamp >= user.lastUnstakeTime + UNSTAKE_DELAY, "Unstake cooldown: 24h not passed");
updatePool();
uint256 pending = (user.amount * accRewardPerShare / PRECISION) - user.rewardDebt;
if (pending > 0) {
nrx.transfer(msg.sender, pending);
emit Claimed(msg.sender, pending);
}
user.amount -= amount;
user.rewardDebt = user.amount * accRewardPerShare / PRECISION;
totalStaked -= amount;
user.lastUnstakeTime = block.timestamp;
nrx.transfer(msg.sender, amount);
emit Unstaked(msg.sender, amount);
}
function claim() external {
StakeInfo storage user = stakes[msg.sender];
require(user.amount > 0, "Nothing to claim");
updatePool();
uint256 pending = (user.amount * accRewardPerShare / PRECISION) - user.rewardDebt;
require(pending > 0, "No reward");
user.rewardDebt = user.amount * accRewardPerShare / PRECISION;
user.lastClaimTime = block.timestamp;
nrx.transfer(msg.sender, pending);
emit Claimed(msg.sender, pending);
}
function updatePool() public {
if (block.timestamp <= lastUpdate || totalStaked == 0) return;
uint256 timeElapsed = block.timestamp - lastUpdate;
uint256 reward = getDynamicAPY() * totalStaked * timeElapsed / 365 days / 1e18;
accRewardPerShare += reward * PRECISION / totalStaked;
lastUpdate = block.timestamp;
}
function getDynamicAPY() public view returns (uint256) {
if (totalStaked == 0) {
return 30e16; // 30%
}
// APY(s) = min(0.3, (0.028 / sqrt(s)) + 0.016)
uint256 s = (totalStaked * 1e18) / (100_000_000 * 1e18); // s in natural scale
uint256 sqrtS = sqrt(s); // now sqrtS has 1e9 scale
// r(s) = 0.028 / sqrt(s) + 0.016
uint256 numerator = 28e15 * 1e9; // Adjust to match sqrt scale
uint256 rewardPart = numerator / sqrtS;
uint256 base = 16e15;
uint256 apy = rewardPart + base;
if (apy > 30e16) apy = 30e16;
return apy;
}
// Babylonian method for sqrt
function sqrt(uint256 x) internal pure returns (uint256 y) {
if (x == 0) return 0;
uint256 z = (x + 1) / 2;
y = x;
while (z < y) {
y = z;
z = (x / z + z) / 2;
}
}
function pendingReward(address userAddr) external view returns (uint256) {
StakeInfo storage user = stakes[userAddr];
if (user.amount == 0) return 0;
uint256 tempAccReward = accRewardPerShare;
if (block.timestamp > lastUpdate && totalStaked > 0) {
uint256 timeElapsed = block.timestamp - lastUpdate;
uint256 reward = getDynamicAPY() * totalStaked * timeElapsed / 365 days / 1e18;
tempAccReward += reward * PRECISION / totalStaked;
}
return (user.amount * tempAccReward / PRECISION) - user.rewardDebt;
}
function emergencyWithdraw(uint256 amount) external onlyOwner {
nrx.transfer(msg.sender, amount);
}
function transferOwnership(address newOwner) external onlyOwner {
owner = newOwner;
}
}
Read Contract
PRECISION 0xaaf5eb68 → uint256
UNSTAKE_DELAY 0xe35e5d84 → uint256
accRewardPerShare 0x939d6237 → uint256
getDynamicAPY 0x680be5f4 → uint256
lastUpdate 0xc0463711 → uint256
nrx 0x0deb1ddf → address
owner 0x8da5cb5b → address
pendingReward 0xf40f0f52 → uint256
stakes 0x16934fc4 → uint256, uint256, uint256, uint256, uint256
totalStaked 0x817b1cd2 → uint256
Write Contract 6 functions
These functions modify contract state and require a wallet transaction to execute.
claim 0x4e71d92d
No parameters
emergencyWithdraw 0x5312ea8e
uint256 amount
stake 0xa694fc3a
uint256 amount
transferOwnership 0xf2fde38b
address newOwner
unstake 0x2e17de78
uint256 amount
updatePool 0xe3161ddd
No parameters
Recent Transactions
No transactions found for this address