22pragma solidity 0.8.27 ;
33
44import { ProvisionTracker } from "./ProvisionTracker.sol " ;
5- import { IDataServiceFees } from "../interfaces/IDataServiceFees.sol " ;
65import { IHorizonStaking } from "../../interfaces/IHorizonStaking.sol " ;
76import { LinkedList } from "../../libraries/LinkedList.sol " ;
87
98library StakeClaims {
109 using ProvisionTracker for mapping (address => uint256 );
1110 using LinkedList for LinkedList.List;
1211
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+
1376 /**
1477 * @notice Locks stake for a service provider to back a payment.
1578 * Creates a stake claim, which is stored in a linked list by service provider.
@@ -30,7 +93,7 @@ library StakeClaims {
3093 */
3194 function lockStake (
3295 mapping (address => uint256 ) storage feesProvisionTracker ,
33- mapping (bytes32 => IDataServiceFees. StakeClaim) storage claims ,
96+ mapping (bytes32 => StakeClaim) storage claims ,
3497 mapping (address serviceProvider = > LinkedList.List list ) storage claimsLists ,
3598 IHorizonStaking graphStaking ,
3699 address _dataService ,
@@ -39,14 +102,14 @@ library StakeClaims {
39102 uint256 _tokens ,
40103 uint256 _unlockTimestamp
41104 ) external {
42- require (_tokens != 0 , IDataServiceFees. DataServiceFeesZeroTokens ());
105+ require (_tokens != 0 , StakeClaimsZeroTokens ());
43106 feesProvisionTracker.lock (graphStaking, _serviceProvider, _tokens, _delegationRatio);
44107
45108 LinkedList.List storage claimsList = claimsLists[_serviceProvider];
46109
47110 // Save item and add to list
48111 bytes32 claimId = _buildStakeClaimId (_dataService, _serviceProvider, claimsList.nonce);
49- claims[claimId] = IDataServiceFees. StakeClaim ({
112+ claims[claimId] = StakeClaim ({
50113 tokens: _tokens,
51114 createdAt: block .timestamp ,
52115 releasableAt: _unlockTimestamp,
@@ -55,7 +118,7 @@ library StakeClaims {
55118 if (claimsList.count != 0 ) claims[claimsList.tail].nextClaim = claimId;
56119 claimsList.addTail (claimId);
57120
58- emit IDataServiceFees. StakeClaimLocked (_serviceProvider, claimId, _tokens, _unlockTimestamp);
121+ emit StakeClaimLocked (_serviceProvider, claimId, _tokens, _unlockTimestamp);
59122 }
60123
61124 /**
@@ -70,12 +133,12 @@ library StakeClaims {
70133 */
71134 function processStakeClaim (
72135 mapping (address serviceProvider = > uint256 tokens ) storage feesProvisionTracker ,
73- mapping (bytes32 claimId = > IDataServiceFees. StakeClaim claim ) storage claims ,
136+ mapping (bytes32 claimId = > StakeClaim claim ) storage claims ,
74137 bytes32 _claimId ,
75138 bytes memory _acc
76139 ) 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));
79142
80143 // early exit
81144 if (claim.releasableAt > block .timestamp ) {
@@ -87,7 +150,7 @@ library StakeClaims {
87150
88151 // process
89152 feesProvisionTracker.release (serviceProvider, claim.tokens);
90- emit IDataServiceFees. StakeClaimReleased (serviceProvider, _claimId, claim.tokens, claim.releasableAt);
153+ emit StakeClaimReleased (serviceProvider, _claimId, claim.tokens, claim.releasableAt);
91154
92155 // encode
93156 _acc = abi.encode (tokensClaimed + claim.tokens, serviceProvider);
@@ -100,10 +163,7 @@ library StakeClaims {
100163 * @param claims The mapping that stores stake claims by their ID
101164 * @param claimId The ID of the stake claim to delete
102165 */
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 {
107167 delete claims[claimId];
108168 }
109169
@@ -115,7 +175,7 @@ library StakeClaims {
115175 * @return The next stake claim ID
116176 */
117177 function getNextStakeClaim (
118- mapping (bytes32 claimId = > IDataServiceFees. StakeClaim claim ) storage claims ,
178+ mapping (bytes32 claimId = > StakeClaim claim ) storage claims ,
119179 bytes32 claimId
120180 ) external view returns (bytes32 ) {
121181 return claims[claimId].nextClaim;
0 commit comments