|
4 | 4 | "errors"
|
5 | 5 |
|
6 | 6 | "gno.land/p/demo/avl"
|
| 7 | + "gno.land/p/demo/ufmt" |
7 | 8 |
|
8 | 9 | u256 "gno.land/p/gnoswap/uint256"
|
9 | 10 | )
|
@@ -249,6 +250,62 @@ func (rs *RewardState) RemoveStake(depositId string, amount uint64, currentHeigh
|
249 | 250 | return reward, nil
|
250 | 251 | }
|
251 | 252 |
|
| 253 | +// region: RewardStates |
| 254 | + |
| 255 | +type RewardStates struct { |
| 256 | + states *avl.Tree // projectId:tier string -> RewardState |
| 257 | +} |
| 258 | + |
| 259 | +func NewRewardStates() RewardStates { |
| 260 | + return RewardStates{ |
| 261 | + states: avl.NewTree(), |
| 262 | + } |
| 263 | +} |
| 264 | + |
| 265 | +func (rs *RewardStates) Get(pid, tier string) (*RewardState, error) { |
| 266 | + key := createId(pid, tier) |
| 267 | + statesI, exists := rs.states.Get(key) |
| 268 | + if !exists { |
| 269 | + return nil, ufmt.Errorf("reward state not found for projectId %s and tierStr %s", pid, tier) |
| 270 | + } |
| 271 | + return statesI.(*RewardState), nil |
| 272 | +} |
| 273 | + |
| 274 | +func (rs *RewardStates) Set(pid, tier string, state *RewardState) error { |
| 275 | + key := createId(pid, tier) |
| 276 | + ok := rs.states.Set(key, state) |
| 277 | + if !ok { |
| 278 | + return ufmt.Errorf("failed to set reward state for projectId %s and tierStr %s", pid, tier) |
| 279 | + } |
| 280 | + return nil |
| 281 | +} |
| 282 | + |
| 283 | +func (rs *RewardStates) DeleteProject(pid string) uint64 { |
| 284 | + totalLeftOver := uint64(0) |
| 285 | + |
| 286 | + keys := make([]string, 0) |
| 287 | + rs.states.Iterate(pid+":", pid+";", func(key string, value interface{}) bool { |
| 288 | + state := value.(*RewardState) |
| 289 | + totalEmptyBlock := state.TotalEmptyBlock() |
| 290 | + if state.TotalStake() == 0 { |
| 291 | + totalEmptyBlock += state.EndHeight() - state.LastHeight() |
| 292 | + } |
| 293 | + |
| 294 | + totalEmptyRewards := u256.Zero().Mul(u256.NewUint(totalEmptyBlock), state.RewardPerBlock()) |
| 295 | + totalLeftOver += totalEmptyRewards.Uint64() |
| 296 | + keys = append(keys, key) |
| 297 | + return false |
| 298 | + }) |
| 299 | + |
| 300 | + for _, key := range keys { |
| 301 | + rs.states.Remove(key) |
| 302 | + } |
| 303 | + |
| 304 | + return totalLeftOver |
| 305 | +} |
| 306 | + |
| 307 | +// region: depositInfo |
| 308 | + |
252 | 309 | // Helper struct for deposit info
|
253 | 310 | type depositInfo struct {
|
254 | 311 | id string
|
|
0 commit comments