- Contract name:
- LongTermPledge
- Optimization enabled
- true
- Compiler version
- v0.8.18+commit.87f61d96
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2024-05-09T07:23:03.356588Z
Contract source code
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0 ; interface IPledge { function upadeNodesStake( address[] calldata addrs, uint256[] calldata uints, uint256 expiredTime, string calldata chain ) external; function nodeAddrSta(address nodeAddr) external view returns (bool); function nodeChainAmount(string memory chain, address nodeAddr) external view returns (uint256); } abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } function _disableInitializers() internal { _initialized = true; } } contract Ownable is Initializable{ address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init_unchained() internal initializer { address msgSender = msg.sender; _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract LongTermPledge is Ownable{ bool private reentrancyLock; IPledge public pledgeContract; uint256 public lockPeriod; uint256 public stakeTokenNum; mapping(uint256 => StakeTokenMsg) public stakeTokenMsg; mapping(address => uint256[]) private stakeList; event StakeToken(uint256 indexed _stakeIndex, address _userAddr, address _nodeAddr, uint256 _amount, uint256 _time, uint256 _lockTime, address _token); event CancleStakeToken(uint256 indexed _stakeIndex, address indexed _userAddr, address _nodeAddr, uint256 _time); event UpdateLockPeriod(uint256 time); struct StakeTokenMsg { address userAddr; address nodeAddr; uint256 start; uint256 lockTime; uint256 end; uint256 tokenAmount; address tokenAddr; } modifier nonReentrant() { require(!reentrancyLock); reentrancyLock = true; _; reentrancyLock = false; } constructor(){_disableInitializers();} function init(address _pledgeContract) external initializer{ __Ownable_init_unchained(); __LongTermPledge_init_unchained(_pledgeContract); } function __LongTermPledge_init_unchained(address _pledgeContract) internal initializer{ pledgeContract = IPledge(_pledgeContract); lockPeriod = 182 days; reentrancyLock = false; } function updateLockPeriod(uint256 _lockPeriod) external onlyOwner{ lockPeriod = _lockPeriod; emit UpdateLockPeriod(_lockPeriod); } function stake(address _nodeAddr, address _token, uint256 _amount) payable external nonReentrant(){ address _sender = msg.sender; _amount = msg.value; require(_token == address(0), "token error"); require(_amount >= 1e16, "value error"); require(pledgeContract.nodeAddrSta(_nodeAddr), "nodeAddr error"); uint256 _nodeStakeNum = pledgeContract.nodeChainAmount("Netmind", _nodeAddr) + _amount; address[] memory _addrArray = new address[](1) ; _addrArray[0] = _nodeAddr; uint256[] memory _stakeAmount = new uint256[](1); _stakeAmount[0] = _nodeStakeNum; pledgeContract.upadeNodesStake(_addrArray, _stakeAmount, block.timestamp+10, "Netmind"); uint256 _stakeTokenNum = ++stakeTokenNum; uint256 _lockTime = block.timestamp + lockPeriod; stakeTokenMsg[_stakeTokenNum] = StakeTokenMsg(_sender, _nodeAddr, block.timestamp, _lockTime, 0, _amount, _token); stakeList[_sender].push(_stakeTokenNum); emit StakeToken(_stakeTokenNum, _sender, _nodeAddr, _amount, block.timestamp, _lockTime,_token); } function cancleStake(uint256[] calldata _indexs) external nonReentrant(){ address _sender = msg.sender; for (uint256 i = 0; i < _indexs.length; i++) { uint256 _stakeTokenMark = _indexs[i]; if (_stakeTokenMark > 0){ StakeTokenMsg storage _stakeTokenMsg = stakeTokenMsg[_stakeTokenMark]; require(_stakeTokenMsg.userAddr == _sender, "sender error"); require(_stakeTokenMsg.lockTime < block.timestamp, "lockTime error"); require(_stakeTokenMsg.end == 0, "The Stake has been redeemed"); _stakeTokenMsg.end = block.timestamp; payable(_stakeTokenMsg.userAddr).transfer(_stakeTokenMsg.tokenAmount); uint256 _nodeStakeNum = pledgeContract.nodeChainAmount("Netmind", _stakeTokenMsg.nodeAddr) - _stakeTokenMsg.tokenAmount; address[] memory _addrArray = new address[](1) ; _addrArray[0] = _stakeTokenMsg.nodeAddr; uint256[] memory _stakeAmount = new uint256[](1); _stakeAmount[0] = _nodeStakeNum; pledgeContract.upadeNodesStake(_addrArray, _stakeAmount, block.timestamp+10, "Netmind"); emit CancleStakeToken(_stakeTokenMark, _sender, _stakeTokenMsg.nodeAddr, block.timestamp); } } } function getStakeList(address addr) public view returns(uint256[] memory){ return stakeList[addr]; } }
Contract ABI
[{"type":"constructor","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancleStake","inputs":[{"type":"uint256[]","name":"_indexs","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getStakeList","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"init","inputs":[{"type":"address","name":"_pledgeContract","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lockPeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPledge"}],"name":"pledgeContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"stake","inputs":[{"type":"address","name":"_nodeAddr","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"userAddr","internalType":"address"},{"type":"address","name":"nodeAddr","internalType":"address"},{"type":"uint256","name":"start","internalType":"uint256"},{"type":"uint256","name":"lockTime","internalType":"uint256"},{"type":"uint256","name":"end","internalType":"uint256"},{"type":"uint256","name":"tokenAmount","internalType":"uint256"},{"type":"address","name":"tokenAddr","internalType":"address"}],"name":"stakeTokenMsg","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakeTokenNum","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateLockPeriod","inputs":[{"type":"uint256","name":"_lockPeriod","internalType":"uint256"}]},{"type":"event","name":"CancleStakeToken","inputs":[{"type":"uint256","name":"_stakeIndex","indexed":true},{"type":"address","name":"_userAddr","indexed":true},{"type":"address","name":"_nodeAddr","indexed":false},{"type":"uint256","name":"_time","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false},{"type":"event","name":"StakeToken","inputs":[{"type":"uint256","name":"_stakeIndex","indexed":true},{"type":"address","name":"_userAddr","indexed":false},{"type":"address","name":"_nodeAddr","indexed":false},{"type":"uint256","name":"_amount","indexed":false},{"type":"uint256","name":"_time","indexed":false},{"type":"uint256","name":"_lockTime","indexed":false},{"type":"address","name":"_token","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateLockPeriod","inputs":[{"type":"uint256","name":"time","indexed":false}],"anonymous":false}]
Deployed ByteCode
0x6080604052600436106100c25760003560e01c80638f32d59b1161007f578063bf6eac2f11610059578063bf6eac2f1461020a578063e473f8a71461021d578063f2fde38b146102c3578063ff64d810146102e357600080fd5b80638f32d59b1461019957806391db7b0d146101ca578063acce5f3d146101ea57600080fd5b806319ab453c146100c75780633fd8b02f146100e9578063557e6cfe14610112578063715018a61461014a57806385d4f0551461015f5780638da5cb5b14610175575b600080fd5b3480156100d357600080fd5b506100e76100e2366004611006565b610310565b005b3480156100f557600080fd5b506100ff60025481565b6040519081526020015b60405180910390f35b34801561011e57600080fd5b50600154610132906001600160a01b031681565b6040516001600160a01b039091168152602001610109565b34801561015657600080fd5b506100e7610397565b34801561016b57600080fd5b506100ff60035481565b34801561018157600080fd5b506000546201000090046001600160a01b0316610132565b3480156101a557600080fd5b506000546201000090046001600160a01b031633146040519015158152602001610109565b3480156101d657600080fd5b506100e76101e5366004611028565b610418565b3480156101f657600080fd5b506100e7610205366004611041565b610483565b6100e76102183660046110b6565b610826565b34801561022957600080fd5b50610282610238366004611028565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006909501546001600160a01b03948516969385169592949192911687565b604080516001600160a01b03988916815296881660208801528601949094526060850192909252608084015260a083015290911660c082015260e001610109565b3480156102cf57600080fd5b506100e76102de366004611006565b610d24565b3480156102ef57600080fd5b506103036102fe366004611006565b610d60565b604051610109919061112d565b600054610100900460ff1680610329575060005460ff16155b61034e5760405162461bcd60e51b815260040161034590611140565b60405180910390fd5b600054610100900460ff16158015610370576000805461ffff19166101011790555b610378610dcc565b61038182610e81565b8015610393576000805461ff00191690555b5050565b6000546201000090046001600160a01b031633146103c75760405162461bcd60e51b81526004016103459061118e565b60008054604051620100009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805462010000600160b01b0319169055565b6000546201000090046001600160a01b031633146104485760405162461bcd60e51b81526004016103459061118e565b60028190556040518181527ffa4546b9a95580d08eebcf7a95f651c534a1fe2ad1b2f3b30210b1568e0fd12a9060200160405180910390a150565b600054600160b01b900460ff161561049a57600080fd5b6000805460ff60b01b1916600160b01b17815533905b828110156108135760008484838181106104cc576104cc6111c3565b905060200201359050600081111561080057600081815260046020526040902080546001600160a01b038581169116146105375760405162461bcd60e51b815260206004820152600c60248201526b39b2b73232b91032b93937b960a11b6044820152606401610345565b4281600301541061057b5760405162461bcd60e51b815260206004820152600e60248201526d3637b1b5aa34b6b29032b93937b960911b6044820152606401610345565b6004810154156105cd5760405162461bcd60e51b815260206004820152601b60248201527f546865205374616b6520686173206265656e2072656465656d656400000000006044820152606401610345565b426004820155805460058201546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610610573d6000803e3d6000fd5b5060058101546001805490830154604051633c0f3f0360e11b8152600093926001600160a01b039081169263781e7e069261065192909116906004016111d9565b602060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610692919061121a565b61069c9190611249565b6040805160018082528183019092529192506000919060208083019080368337505050600184015481519192506001600160a01b03169082906000906106e4576106e46111c3565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090508281600081518110610735576107356111c3565b60209081029190910101526001546001600160a01b03166346defac5838361075e42600a611262565b6040518463ffffffff1660e01b815260040161077c93929190611275565b600060405180830381600087803b15801561079657600080fd5b505af11580156107aa573d6000803e3d6000fd5b505050506001840154604080516001600160a01b0392831681524260208201529189169187917f32f0115ad5ecbe61fc028c71d04d7b8dd093bcb7785a110e450a491002ac6f6a910160405180910390a3505050505b508061080b81611304565b9150506104b0565b50506000805460ff60b01b191690555050565b600054600160b01b900460ff161561083d57600080fd5b506000805460ff60b01b1916600160b01b17905534336001600160a01b038316156108985760405162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b6044820152606401610345565b662386f26fc100008210156108dd5760405162461bcd60e51b815260206004820152600b60248201526a3b30b63ab29032b93937b960a91b6044820152606401610345565b600154604051636157c81f60e01b81526001600160a01b03868116600483015290911690636157c81f90602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b919061131d565b6109885760405162461bcd60e51b815260206004820152600e60248201526d3737b232a0b232391032b93937b960911b6044820152606401610345565b600154604051633c0f3f0360e11b815260009184916001600160a01b039091169063781e7e06906109bd9089906004016111d9565b602060405180830381865afa1580156109da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fe919061121a565b610a089190611262565b60408051600180825281830190925291925060009190602080830190803683370190505090508581600081518110610a4257610a426111c3565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090508281600081518110610a9357610a936111c3565b60209081029190910101526001546001600160a01b03166346defac58383610abc42600a611262565b6040518463ffffffff1660e01b8152600401610ada93929190611275565b600060405180830381600087803b158015610af457600080fd5b505af1158015610b08573d6000803e3d6000fd5b505050506000600360008154610b1d90611304565b9190508190559050600060025442610b359190611262565b90506040518060e00160405280876001600160a01b031681526020018a6001600160a01b0316815260200142815260200182815260200160008152602001888152602001896001600160a01b03168152506004600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555090505060056000876001600160a01b03166001600160a01b03168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055817f0138c1552d21687e076c0ce8ae6632cc57a4076d85dcce2a083f4cf50ce29e96878b8a42868e604051610d04969594939291906001600160a01b039687168152948616602086015260408501939093526060840191909152608083015290911660a082015260c00190565b60405180910390a250506000805460ff60b01b1916905550505050505050565b6000546201000090046001600160a01b03163314610d545760405162461bcd60e51b81526004016103459061118e565b610d5d81610f1c565b50565b6001600160a01b038116600090815260056020908152604091829020805483518184028101840190945280845260609392830182828015610dc057602002820191906000526020600020905b815481526020019060010190808311610dac575b50505050509050919050565b600054610100900460ff1680610de5575060005460ff16155b610e015760405162461bcd60e51b815260040161034590611140565b600054610100900460ff16158015610e23576000805461ffff19166101011790555b6000805462010000600160b01b03191633620100008102919091178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610d5d576000805461ff001916905550565b600054610100900460ff1680610e9a575060005460ff16155b610eb65760405162461bcd60e51b815260040161034590611140565b600054610100900460ff16158015610ed8576000805461ffff19166101011790555b600180546001600160a01b0319166001600160a01b03841617905562eff1006002556000805460ff60b01b191690558015610393576000805461ff00191690555050565b6001600160a01b038116610f815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610345565b600080546040516001600160a01b03808516936201000090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b80356001600160a01b038116811461100157600080fd5b919050565b60006020828403121561101857600080fd5b61102182610fea565b9392505050565b60006020828403121561103a57600080fd5b5035919050565b6000806020838503121561105457600080fd5b823567ffffffffffffffff8082111561106c57600080fd5b818501915085601f83011261108057600080fd5b81358181111561108f57600080fd5b8660208260051b85010111156110a457600080fd5b60209290920196919550909350505050565b6000806000606084860312156110cb57600080fd5b6110d484610fea565b92506110e260208501610fea565b9150604084013590509250925092565b600081518084526020808501945080840160005b8381101561112257815187529582019590820190600101611106565b509495945050505050565b60208152600061102160208301846110f2565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60408152600061120060408301600781526613995d1b5a5b9960ca1b602082015260400190565b6001600160a01b0393909316602092909201919091525090565b60006020828403121561122c57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561125c5761125c611233565b92915050565b8082018082111561125c5761125c611233565b6080808252845190820181905260009060209060a0840190828801845b828110156112b75781516001600160a01b031684529284019290840190600101611292565b505050838103828501526112cb81876110f2565b91505083604084015282810360608401526112fa81600781526613995d1b5a5b9960ca1b602082015260400190565b9695505050505050565b60006001820161131657611316611233565b5060010190565b60006020828403121561132f57600080fd5b8151801515811461102157600080fdfea2646970667358221220a79f99fd1a8d88f2b78d71ba53f1484f04d0859fdd22901a794e6a51d244b30664736f6c63430008120033