Skip to content

Commit 23f1436

Browse files
feat: implement Indexing Agreements
1 parent d89440a commit 23f1436

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+5734
-541
lines changed

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

Lines changed: 16 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { IDataServiceFees } from "../interfaces/IDataServiceFees.sol";
55

66
import { ProvisionTracker } from "../libraries/ProvisionTracker.sol";
77
import { LinkedList } from "../../libraries/LinkedList.sol";
8+
import { StakeClaims } from "../libraries/StakeClaims.sol";
89

910
import { DataService } from "../DataService.sol";
1011
import { DataServiceFeesV1Storage } from "./DataServiceFeesStorage.sol";
@@ -41,23 +42,17 @@ abstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDat
4142
* @param _unlockTimestamp The timestamp when the tokens can be released
4243
*/
4344
function _lockStake(address _serviceProvider, uint256 _tokens, uint256 _unlockTimestamp) internal {
44-
require(_tokens != 0, DataServiceFeesZeroTokens());
45-
feesProvisionTracker.lock(_graphStaking(), _serviceProvider, _tokens, _delegationRatio);
46-
47-
LinkedList.List storage claimsList = claimsLists[_serviceProvider];
48-
49-
// Save item and add to list
50-
bytes32 claimId = _buildStakeClaimId(_serviceProvider, claimsList.nonce);
51-
claims[claimId] = StakeClaim({
52-
tokens: _tokens,
53-
createdAt: block.timestamp,
54-
releasableAt: _unlockTimestamp,
55-
nextClaim: bytes32(0)
56-
});
57-
if (claimsList.count != 0) claims[claimsList.tail].nextClaim = claimId;
58-
claimsList.addTail(claimId);
59-
60-
emit StakeClaimLocked(_serviceProvider, claimId, _tokens, _unlockTimestamp);
45+
StakeClaims.lockStake(
46+
feesProvisionTracker,
47+
claims,
48+
claimsLists,
49+
_graphStaking(),
50+
address(this),
51+
_delegationRatio,
52+
_serviceProvider,
53+
_tokens,
54+
_unlockTimestamp
55+
);
6156
}
6257

6358
/**
@@ -80,7 +75,7 @@ abstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDat
8075
_numClaimsToRelease
8176
);
8277

83-
emit StakeClaimsReleased(_serviceProvider, claimsReleased, abi.decode(data, (uint256)));
78+
emit StakeClaims.StakeClaimsReleased(_serviceProvider, claimsReleased, abi.decode(data, (uint256)));
8479
}
8580

8681
/**
@@ -92,23 +87,7 @@ abstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDat
9287
* @return The updated accumulator data
9388
*/
9489
function _processStakeClaim(bytes32 _claimId, bytes memory _acc) private returns (bool, bytes memory) {
95-
StakeClaim memory claim = _getStakeClaim(_claimId);
96-
97-
// early exit
98-
if (claim.releasableAt > block.timestamp) {
99-
return (true, LinkedList.NULL_BYTES);
100-
}
101-
102-
// decode
103-
(uint256 tokensClaimed, address serviceProvider) = abi.decode(_acc, (uint256, address));
104-
105-
// process
106-
feesProvisionTracker.release(serviceProvider, claim.tokens);
107-
emit StakeClaimReleased(serviceProvider, _claimId, claim.tokens, claim.releasableAt);
108-
109-
// encode
110-
_acc = abi.encode(tokensClaimed + claim.tokens, serviceProvider);
111-
return (false, _acc);
90+
return StakeClaims.processStakeClaim(feesProvisionTracker, claims, _claimId, _acc);
11291
}
11392

11493
/**
@@ -117,18 +96,7 @@ abstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDat
11796
* @param _claimId The ID of the stake claim to delete
11897
*/
11998
function _deleteStakeClaim(bytes32 _claimId) private {
120-
delete claims[_claimId];
121-
}
122-
123-
/**
124-
* @notice Gets the details of a stake claim
125-
* @param _claimId The ID of the stake claim
126-
* @return The stake claim details
127-
*/
128-
function _getStakeClaim(bytes32 _claimId) private view returns (StakeClaim memory) {
129-
StakeClaim memory claim = claims[_claimId];
130-
require(claim.createdAt != 0, DataServiceFeesClaimNotFound(_claimId));
131-
return claim;
99+
StakeClaims.deleteStakeClaim(claims, _claimId);
132100
}
133101

134102
/**
@@ -138,16 +106,6 @@ abstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDat
138106
* @return The next stake claim ID
139107
*/
140108
function _getNextStakeClaim(bytes32 _claimId) private view returns (bytes32) {
141-
return claims[_claimId].nextClaim;
142-
}
143-
144-
/**
145-
* @notice Builds a stake claim ID
146-
* @param _serviceProvider The address of the service provider
147-
* @param _nonce A nonce of the stake claim
148-
* @return The stake claim ID
149-
*/
150-
function _buildStakeClaimId(address _serviceProvider, uint256 _nonce) private view returns (bytes32) {
151-
return keccak256(abi.encodePacked(address(this), _serviceProvider, _nonce));
109+
return StakeClaims.getNextStakeClaim(claims, _claimId);
152110
}
153111
}

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

0 commit comments

Comments
 (0)