2
2
pragma solidity 0.8.27 ;
3
3
4
4
import { ProvisionTracker } from "./ProvisionTracker.sol " ;
5
- import { IDataServiceFees } from "../interfaces/IDataServiceFees.sol " ;
6
5
import { IHorizonStaking } from "../../interfaces/IHorizonStaking.sol " ;
7
6
import { LinkedList } from "../../libraries/LinkedList.sol " ;
8
7
9
8
library StakeClaims {
10
9
using ProvisionTracker for mapping (address => uint256 );
11
10
using LinkedList for LinkedList.List;
12
11
12
+ /**
13
+ * @notice A stake claim, representing provisioned stake that gets locked
14
+ * to be released to a service provider.
15
+ * @dev StakeClaims are stored in linked lists by service provider, ordered by
16
+ * creation timestamp.
17
+ * @param tokens The amount of tokens to be locked in the claim
18
+ * @param createdAt The timestamp when the claim was created
19
+ * @param releasableAt The timestamp when the tokens can be released
20
+ * @param nextClaim The next claim in the linked list
21
+ */
22
+ struct StakeClaim {
23
+ uint256 tokens;
24
+ uint256 createdAt;
25
+ uint256 releasableAt;
26
+ bytes32 nextClaim;
27
+ }
28
+
29
+ /**
30
+ * @notice Emitted when a stake claim is created and stake is locked.
31
+ * @param serviceProvider The address of the service provider
32
+ * @param claimId The id of the stake claim
33
+ * @param tokens The amount of tokens to lock in the claim
34
+ * @param unlockTimestamp The timestamp when the tokens can be released
35
+ */
36
+ event StakeClaimLocked (
37
+ address indexed serviceProvider ,
38
+ bytes32 indexed claimId ,
39
+ uint256 tokens ,
40
+ uint256 unlockTimestamp
41
+ );
42
+
43
+ /**
44
+ * @notice Emitted when a stake claim is released and stake is unlocked.
45
+ * @param serviceProvider The address of the service provider
46
+ * @param claimId The id of the stake claim
47
+ * @param tokens The amount of tokens released
48
+ * @param releasableAt The timestamp when the tokens were released
49
+ */
50
+ event StakeClaimReleased (
51
+ address indexed serviceProvider ,
52
+ bytes32 indexed claimId ,
53
+ uint256 tokens ,
54
+ uint256 releasableAt
55
+ );
56
+
57
+ /**
58
+ * @notice Emitted when a series of stake claims are released.
59
+ * @param serviceProvider The address of the service provider
60
+ * @param claimsCount The number of stake claims being released
61
+ * @param tokensReleased The total amount of tokens being released
62
+ */
63
+ event StakeClaimsReleased (address indexed serviceProvider , uint256 claimsCount , uint256 tokensReleased );
64
+
65
+ /**
66
+ * @notice Thrown when attempting to get a stake claim that does not exist.
67
+ * @param claimId The id of the stake claim
68
+ */
69
+ error StakeClaimsClaimNotFound (bytes32 claimId );
70
+
71
+ /**
72
+ * @notice Emitted when trying to lock zero tokens in a stake claim
73
+ */
74
+ error StakeClaimsZeroTokens ();
75
+
13
76
/**
14
77
* @notice Locks stake for a service provider to back a payment.
15
78
* Creates a stake claim, which is stored in a linked list by service provider.
@@ -30,7 +93,7 @@ library StakeClaims {
30
93
*/
31
94
function lockStake (
32
95
mapping (address => uint256 ) storage feesProvisionTracker ,
33
- mapping (bytes32 => IDataServiceFees. StakeClaim) storage claims ,
96
+ mapping (bytes32 => StakeClaim) storage claims ,
34
97
mapping (address serviceProvider = > LinkedList.List list ) storage claimsLists ,
35
98
IHorizonStaking graphStaking ,
36
99
address _dataService ,
@@ -39,14 +102,14 @@ library StakeClaims {
39
102
uint256 _tokens ,
40
103
uint256 _unlockTimestamp
41
104
) external {
42
- require (_tokens != 0 , IDataServiceFees. DataServiceFeesZeroTokens ());
105
+ require (_tokens != 0 , StakeClaimsZeroTokens ());
43
106
feesProvisionTracker.lock (graphStaking, _serviceProvider, _tokens, _delegationRatio);
44
107
45
108
LinkedList.List storage claimsList = claimsLists[_serviceProvider];
46
109
47
110
// Save item and add to list
48
111
bytes32 claimId = _buildStakeClaimId (_dataService, _serviceProvider, claimsList.nonce);
49
- claims[claimId] = IDataServiceFees. StakeClaim ({
112
+ claims[claimId] = StakeClaim ({
50
113
tokens: _tokens,
51
114
createdAt: block .timestamp ,
52
115
releasableAt: _unlockTimestamp,
@@ -55,7 +118,7 @@ library StakeClaims {
55
118
if (claimsList.count != 0 ) claims[claimsList.tail].nextClaim = claimId;
56
119
claimsList.addTail (claimId);
57
120
58
- emit IDataServiceFees. StakeClaimLocked (_serviceProvider, claimId, _tokens, _unlockTimestamp);
121
+ emit StakeClaimLocked (_serviceProvider, claimId, _tokens, _unlockTimestamp);
59
122
}
60
123
61
124
/**
@@ -70,12 +133,12 @@ library StakeClaims {
70
133
*/
71
134
function processStakeClaim (
72
135
mapping (address serviceProvider = > uint256 tokens ) storage feesProvisionTracker ,
73
- mapping (bytes32 claimId = > IDataServiceFees. StakeClaim claim ) storage claims ,
136
+ mapping (bytes32 claimId = > StakeClaim claim ) storage claims ,
74
137
bytes32 _claimId ,
75
138
bytes memory _acc
76
139
) external returns (bool , bytes memory ) {
77
- IDataServiceFees. StakeClaim memory claim = claims[_claimId];
78
- require (claim.createdAt != 0 , IDataServiceFees. DataServiceFeesClaimNotFound (_claimId));
140
+ StakeClaim memory claim = claims[_claimId];
141
+ require (claim.createdAt != 0 , StakeClaimsClaimNotFound (_claimId));
79
142
80
143
// early exit
81
144
if (claim.releasableAt > block .timestamp ) {
@@ -87,7 +150,7 @@ library StakeClaims {
87
150
88
151
// process
89
152
feesProvisionTracker.release (serviceProvider, claim.tokens);
90
- emit IDataServiceFees. StakeClaimReleased (serviceProvider, _claimId, claim.tokens, claim.releasableAt);
153
+ emit StakeClaimReleased (serviceProvider, _claimId, claim.tokens, claim.releasableAt);
91
154
92
155
// encode
93
156
_acc = abi.encode (tokensClaimed + claim.tokens, serviceProvider);
@@ -100,10 +163,7 @@ library StakeClaims {
100
163
* @param claims The mapping that stores stake claims by their ID
101
164
* @param claimId The ID of the stake claim to delete
102
165
*/
103
- function deleteStakeClaim (
104
- mapping (bytes32 claimId = > IDataServiceFees.StakeClaim claim ) storage claims ,
105
- bytes32 claimId
106
- ) external {
166
+ function deleteStakeClaim (mapping (bytes32 claimId = > StakeClaim claim ) storage claims , bytes32 claimId ) external {
107
167
delete claims[claimId];
108
168
}
109
169
@@ -115,7 +175,7 @@ library StakeClaims {
115
175
* @return The next stake claim ID
116
176
*/
117
177
function getNextStakeClaim (
118
- mapping (bytes32 claimId = > IDataServiceFees. StakeClaim claim ) storage claims ,
178
+ mapping (bytes32 claimId = > StakeClaim claim ) storage claims ,
119
179
bytes32 claimId
120
180
) external view returns (bytes32 ) {
121
181
return claims[claimId].nextClaim;
0 commit comments