Skip to content

Commit 91b341a

Browse files
f: move StakeClaim stuff
1 parent 9a296b6 commit 91b341a

File tree

6 files changed

+87
-90
lines changed

6 files changed

+87
-90
lines changed

packages/horizon/contracts/data-service/extensions/DataServiceFees.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ abstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDat
7575
_numClaimsToRelease
7676
);
7777

78-
emit StakeClaimsReleased(_serviceProvider, claimsReleased, abi.decode(data, (uint256)));
78+
emit StakeClaims.StakeClaimsReleased(_serviceProvider, claimsReleased, abi.decode(data, (uint256)));
7979
}
8080

8181
/**

packages/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: GPL-3.0-or-later
22
pragma solidity 0.8.27;
33

4-
import { IDataServiceFees } from "../interfaces/IDataServiceFees.sol";
4+
import { StakeClaims } from "../libraries/StakeClaims.sol";
55

66
import { LinkedList } from "../../libraries/LinkedList.sol";
77

@@ -15,7 +15,7 @@ abstract contract DataServiceFeesV1Storage {
1515
mapping(address serviceProvider => uint256 tokens) public feesProvisionTracker;
1616

1717
/// @notice List of all locked stake claims to be released to service providers
18-
mapping(bytes32 claimId => IDataServiceFees.StakeClaim claim) public claims;
18+
mapping(bytes32 claimId => StakeClaims.StakeClaim claim) public claims;
1919

2020
/// @notice Service providers registered in the data service
2121
mapping(address serviceProvider => LinkedList.List list) public claimsLists;

packages/horizon/contracts/data-service/interfaces/IDataServiceFees.sol

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -22,70 +22,6 @@ import { IDataService } from "./IDataService.sol";
2222
* bugs. We may have an active bug bounty program.
2323
*/
2424
interface IDataServiceFees is IDataService {
25-
/**
26-
* @notice A stake claim, representing provisioned stake that gets locked
27-
* to be released to a service provider.
28-
* @dev StakeClaims are stored in linked lists by service provider, ordered by
29-
* creation timestamp.
30-
* @param tokens The amount of tokens to be locked in the claim
31-
* @param createdAt The timestamp when the claim was created
32-
* @param releasableAt The timestamp when the tokens can be released
33-
* @param nextClaim The next claim in the linked list
34-
*/
35-
struct StakeClaim {
36-
uint256 tokens;
37-
uint256 createdAt;
38-
uint256 releasableAt;
39-
bytes32 nextClaim;
40-
}
41-
42-
/**
43-
* @notice Emitted when a stake claim is created and stake is locked.
44-
* @param serviceProvider The address of the service provider
45-
* @param claimId The id of the stake claim
46-
* @param tokens The amount of tokens to lock in the claim
47-
* @param unlockTimestamp The timestamp when the tokens can be released
48-
*/
49-
event StakeClaimLocked(
50-
address indexed serviceProvider,
51-
bytes32 indexed claimId,
52-
uint256 tokens,
53-
uint256 unlockTimestamp
54-
);
55-
56-
/**
57-
* @notice Emitted when a stake claim is released and stake is unlocked.
58-
* @param serviceProvider The address of the service provider
59-
* @param claimId The id of the stake claim
60-
* @param tokens The amount of tokens released
61-
* @param releasableAt The timestamp when the tokens were released
62-
*/
63-
event StakeClaimReleased(
64-
address indexed serviceProvider,
65-
bytes32 indexed claimId,
66-
uint256 tokens,
67-
uint256 releasableAt
68-
);
69-
70-
/**
71-
* @notice Emitted when a series of stake claims are released.
72-
* @param serviceProvider The address of the service provider
73-
* @param claimsCount The number of stake claims being released
74-
* @param tokensReleased The total amount of tokens being released
75-
*/
76-
event StakeClaimsReleased(address indexed serviceProvider, uint256 claimsCount, uint256 tokensReleased);
77-
78-
/**
79-
* @notice Thrown when attempting to get a stake claim that does not exist.
80-
* @param claimId The id of the stake claim
81-
*/
82-
error DataServiceFeesClaimNotFound(bytes32 claimId);
83-
84-
/**
85-
* @notice Emitted when trying to lock zero tokens in a stake claim
86-
*/
87-
error DataServiceFeesZeroTokens();
88-
8925
/**
9026
* @notice Releases expired stake claims for the caller.
9127
* @dev This function is only meant to be called if the service provider has enough

packages/horizon/contracts/data-service/libraries/StakeClaims.sol

Lines changed: 74 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,77 @@
22
pragma solidity 0.8.27;
33

44
import { ProvisionTracker } from "./ProvisionTracker.sol";
5-
import { IDataServiceFees } from "../interfaces/IDataServiceFees.sol";
65
import { IHorizonStaking } from "../../interfaces/IHorizonStaking.sol";
76
import { LinkedList } from "../../libraries/LinkedList.sol";
87

98
library 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;

packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ pragma solidity 0.8.27;
33

44
import { HorizonStakingSharedTest } from "../../shared/horizon-staking/HorizonStakingShared.t.sol";
55
import { DataServiceImpFees } from "../implementations/DataServiceImpFees.sol";
6-
import { IDataServiceFees } from "../../../../contracts/data-service/interfaces/IDataServiceFees.sol";
6+
import { StakeClaims } from "../../../../contracts/data-service/libraries/StakeClaims.sol";
77
import { ProvisionTracker } from "../../../../contracts/data-service/libraries/ProvisionTracker.sol";
88
import { LinkedList } from "../../../../contracts/libraries/LinkedList.sol";
99

@@ -13,7 +13,7 @@ contract DataServiceFeesTest is HorizonStakingSharedTest {
1313
useIndexer
1414
useProvisionDataService(address(dataService), PROVISION_TOKENS, 0, 0)
1515
{
16-
vm.expectRevert(abi.encodeWithSignature("DataServiceFeesZeroTokens()"));
16+
vm.expectRevert(abi.encodeWithSignature("StakeClaimsZeroTokens()"));
1717
dataService.lockStake(users.indexer, 0);
1818
}
1919

@@ -132,6 +132,7 @@ contract DataServiceFeesTest is HorizonStakingSharedTest {
132132
uint256 stakeToLock;
133133
bytes32 predictedClaimId;
134134
}
135+
135136
function _assert_lockStake(address serviceProvider, uint256 tokens) private {
136137
// before state
137138
(bytes32 beforeHead, , uint256 beforeNonce, uint256 beforeCount) = dataService.claimsLists(serviceProvider);
@@ -146,7 +147,7 @@ contract DataServiceFeesTest is HorizonStakingSharedTest {
146147

147148
// it should emit a an event
148149
vm.expectEmit();
149-
emit IDataServiceFees.StakeClaimLocked(
150+
emit StakeClaims.StakeClaimLocked(
150151
serviceProvider,
151152
calcValues.predictedClaimId,
152153
calcValues.stakeToLock,
@@ -185,6 +186,7 @@ contract DataServiceFeesTest is HorizonStakingSharedTest {
185186
uint256 tokensReleased;
186187
bytes32 head;
187188
}
189+
188190
function _assert_releaseStake(address serviceProvider, uint256 numClaimsToRelease) private {
189191
// before state
190192
(bytes32 beforeHead, bytes32 beforeTail, uint256 beforeNonce, uint256 beforeCount) = dataService.claimsLists(
@@ -208,14 +210,14 @@ contract DataServiceFeesTest is HorizonStakingSharedTest {
208210
break;
209211
}
210212

211-
emit IDataServiceFees.StakeClaimReleased(serviceProvider, calcValues.head, claimTokens, releasableAt);
213+
emit StakeClaims.StakeClaimReleased(serviceProvider, calcValues.head, claimTokens, releasableAt);
212214
calcValues.head = nextClaim;
213215
calcValues.tokensReleased += claimTokens;
214216
calcValues.claimsCount++;
215217
}
216218

217219
// it should emit a an event
218-
emit IDataServiceFees.StakeClaimsReleased(serviceProvider, calcValues.claimsCount, calcValues.tokensReleased);
220+
emit StakeClaims.StakeClaimsReleased(serviceProvider, calcValues.claimsCount, calcValues.tokensReleased);
219221
dataService.releaseStake(numClaimsToRelease);
220222

221223
// after state

packages/subgraph-service/test/unit/subgraphService/SubgraphService.t.sol

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { IHorizonStakingTypes } from "@graphprotocol/horizon/contracts/interface
1010
import { IGraphTallyCollector } from "@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol";
1111
import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
1212
import { LinkedList } from "@graphprotocol/horizon/contracts/libraries/LinkedList.sol";
13-
import { IDataServiceFees } from "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol";
1413
import { IHorizonStakingTypes } from "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol";
1514
import { StakeClaims } from "@graphprotocol/horizon/contracts/data-service/libraries/StakeClaims.sol";
1615

@@ -405,7 +404,7 @@ contract SubgraphServiceTest is SubgraphServiceSharedTest {
405404
// Check the stake claim
406405
LinkedList.List memory claimsList = _getClaimList(_indexer);
407406
bytes32 claimId = _buildStakeClaimId(_indexer, claimsList.nonce - 1);
408-
IDataServiceFees.StakeClaim memory stakeClaim = _getStakeClaim(claimId);
407+
StakeClaims.StakeClaim memory stakeClaim = _getStakeClaim(claimId);
409408
uint64 disputePeriod = disputeManager.getDisputePeriod();
410409
assertEq(stakeClaim.tokens, tokensToLock);
411410
assertEq(stakeClaim.createdAt, block.timestamp);
@@ -517,9 +516,9 @@ contract SubgraphServiceTest is SubgraphServiceSharedTest {
517516
return StakeClaims.buildStakeClaimId(address(subgraphService), _indexer, _nonce);
518517
}
519518

520-
function _getStakeClaim(bytes32 _claimId) private view returns (IDataServiceFees.StakeClaim memory) {
519+
function _getStakeClaim(bytes32 _claimId) private view returns (StakeClaims.StakeClaim memory) {
521520
(uint256 tokens, uint256 createdAt, uint256 releasableAt, bytes32 nextClaim) = subgraphService.claims(_claimId);
522-
return IDataServiceFees.StakeClaim(tokens, createdAt, releasableAt, nextClaim);
521+
return StakeClaims.StakeClaim(tokens, createdAt, releasableAt, nextClaim);
523522
}
524523

525524
// This doesn't matter for testing because the metadata is not decoded onchain but it's expected to be of the form:

0 commit comments

Comments
 (0)