-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathview.sol
173 lines (111 loc) · 6.41 KB
/
view.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.19;
interface InterfaceValidator {
enum Status {
// validator not exist, default status
NotExist,
// validator created
Created,
// anyone has staked for the validator
Staked,
// validator's staked coins < MinimalStakingCoin
Unstaked,
// validator is jailed by system(validator have to repropose)
Jailed
}
struct Description {
string moniker;
string identity;
string website;
string email;
string details;
}
function getTopValidators() external view returns(address[] memory);
function getValidatorInfo(address val)external view returns(address payable, Status, uint256, uint256, uint256, uint256, address[] memory);
function getValidatorDescription(address val) external view returns ( string memory,string memory,string memory,string memory,string memory);
function totalStake() external view returns(uint256);
function getStakingInfo(address staker, address validator) external view returns(uint256, uint256, uint256);
function viewStakeReward(address _staker, address _validator) external view returns(uint256);
function MinimalStakingCoin() external view returns(uint256);
function isTopValidator(address who) external view returns (bool);
function StakingLockPeriod() external view returns(uint64);
function UnstakeLockPeriod() external view returns(uint64);
function WithdrawProfitPeriod() external view returns(uint64);
}
contract ValidatorData {
InterfaceValidator public valContract = InterfaceValidator(0x000000000000000000000000000000000000f000);
function getAllValidatorInfo() external view returns (uint256 totalValidatorCount,uint256 totalStakedCoins,address[] memory,InterfaceValidator.Status[] memory,uint256[] memory,string[] memory,string[] memory)
{
address[] memory highestValidatorsSet = valContract.getTopValidators();
uint256 totalValidators = highestValidatorsSet.length;
InterfaceValidator.Status[] memory statusArray = new InterfaceValidator.Status[](totalValidators);
uint256[] memory coinsArray = new uint256[](totalValidators);
string[] memory identityArray = new string[](totalValidators);
string[] memory websiteArray = new string[](totalValidators);
for(uint8 i=0; i < totalValidators; i++){
(, InterfaceValidator.Status status, uint256 coins, , , , ) = valContract.getValidatorInfo(highestValidatorsSet[i]);
(, string memory identity, string memory website, ,) = valContract.getValidatorDescription(highestValidatorsSet[i]);
statusArray[i] = status;
coinsArray[i] = coins;
identityArray[i] = identity;
websiteArray[i] = website;
}
return(totalValidators, valContract.totalStake(), highestValidatorsSet, statusArray, coinsArray, identityArray, websiteArray);
}
function validatorSpecificInfo1(address validatorAddress, address user) external view returns(string memory identityName, string memory website, string memory otherDetails, uint256 withdrawableRewards, uint256 stakedCoins, uint256 waitingBlocksForUnstake ){
(, string memory identity, string memory websiteLocal, ,string memory details) = valContract.getValidatorDescription(validatorAddress);
uint256 unstakeBlock;
uint256 withdrawableReward;
(stakedCoins, unstakeBlock, ) = valContract.getStakingInfo(user,validatorAddress);
if(unstakeBlock!=0){
waitingBlocksForUnstake = stakedCoins;
stakedCoins = 0;
}
else{
withdrawableReward = valContract.viewStakeReward(user, validatorAddress);
}
return(identity, websiteLocal, details, withdrawableReward, stakedCoins, waitingBlocksForUnstake) ;
}
function validatorSpecificInfo2(address validatorAddress, address user) external view returns(uint256 totalStakedCoins, InterfaceValidator.Status status, uint256 selfStakedCoins, uint256 masterVoters, uint256 stakers, address){
address[] memory stakersArray;
(, status, totalStakedCoins, , , , stakersArray) = valContract.getValidatorInfo(validatorAddress);
(selfStakedCoins, , ) = valContract.getStakingInfo(validatorAddress,validatorAddress);
return (totalStakedCoins, status, selfStakedCoins, 0, stakersArray.length, user);
}
function waitingWithdrawProfit(address user, address validatorAddress) external view returns(uint256){
//only validator will have waiting
if(user== validatorAddress && valContract.isTopValidator(validatorAddress)){
(, , , , , uint256 lastWithdrawProfitsBlock, ) = valContract.getValidatorInfo(validatorAddress);
if(lastWithdrawProfitsBlock + valContract.WithdrawProfitPeriod() > block.number){
return 3 * ((lastWithdrawProfitsBlock + valContract.WithdrawProfitPeriod()) - block.number);
}
}
return 0;
}
function waitingUnstaking(address user, address validator) external view returns(uint256){
//this function is kept as it is for the UI compatibility
//no waiting for unstaking
return 0;
}
function waitingWithdrawStaking(address user, address validatorAddress) public view returns(uint256){
//validator and delegators will have waiting
(, uint256 unstakeBlock, ) = valContract.getStakingInfo(user,validatorAddress);
if(unstakeBlock==0){
return 0;
}
if(unstakeBlock + valContract.StakingLockPeriod() > block.number){
return 3 * ((unstakeBlock + valContract.StakingLockPeriod()) - block.number);
}
return 0;
}
function minimumStakingAmount() external view returns(uint256){
return valContract.MinimalStakingCoin();
}
function stakingValidations(address user, address validatorAddress) external view returns(uint256 minimumStakingAmt, uint256 stakingWaiting){
return (valContract.MinimalStakingCoin(), waitingWithdrawStaking(user, validatorAddress));
}
function checkValidator(address user) external view returns(bool){
//this function is for UI compatibility
return true;
}
}