Skip to content

Commit cfd8d0d

Browse files
HACK: DataServiceFeesLib
1 parent cd4d303 commit cfd8d0d

File tree

2 files changed

+160
-49
lines changed

2 files changed

+160
-49
lines changed

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

Lines changed: 57 additions & 49 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 { DataServiceFeesLib } from "../libraries/DataServiceFeesLib.sol";
89

910
import { DataService } from "../DataService.sol";
1011
import { DataServiceFeesV1Storage } from "./DataServiceFeesStorage.sol";
@@ -41,23 +42,34 @@ 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+
// require(_tokens != 0, DataServiceFeesZeroTokens());
46+
// feesProvisionTracker.lock(_graphStaking(), _serviceProvider, _tokens, _delegationRatio);
47+
48+
// LinkedList.List storage claimsList = claimsLists[_serviceProvider];
49+
50+
// // Save item and add to list
51+
// bytes32 claimId = _buildStakeClaimId(_serviceProvider, claimsList.nonce);
52+
// claims[claimId] = StakeClaim({
53+
// tokens: _tokens,
54+
// createdAt: block.timestamp,
55+
// releasableAt: _unlockTimestamp,
56+
// nextClaim: bytes32(0)
57+
// });
58+
// if (claimsList.count != 0) claims[claimsList.tail].nextClaim = claimId;
59+
// claimsList.addTail(claimId);
60+
61+
// emit StakeClaimLocked(_serviceProvider, claimId, _tokens, _unlockTimestamp);
62+
63+
DataServiceFeesLib.lockStake(
64+
_delegationRatio,
65+
feesProvisionTracker,
66+
claims,
67+
claimsLists,
68+
_graphStaking(),
69+
_serviceProvider,
70+
_tokens,
71+
_unlockTimestamp
72+
);
6173
}
6274

6375
/**
@@ -92,23 +104,25 @@ abstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDat
92104
* @return The updated accumulator data
93105
*/
94106
function _processStakeClaim(bytes32 _claimId, bytes memory _acc) private returns (bool, bytes memory) {
95-
StakeClaim memory claim = _getStakeClaim(_claimId);
107+
// StakeClaim memory claim = _getStakeClaim(_claimId);
96108

97-
// early exit
98-
if (claim.releasableAt > block.timestamp) {
99-
return (true, LinkedList.NULL_BYTES);
100-
}
109+
// // early exit
110+
// if (claim.releasableAt > block.timestamp) {
111+
// return (true, LinkedList.NULL_BYTES);
112+
// }
101113

102-
// decode
103-
(uint256 tokensClaimed, address serviceProvider) = abi.decode(_acc, (uint256, address));
114+
// // decode
115+
// (uint256 tokensClaimed, address serviceProvider) = abi.decode(_acc, (uint256, address));
104116

105-
// process
106-
feesProvisionTracker.release(serviceProvider, claim.tokens);
107-
emit StakeClaimReleased(serviceProvider, _claimId, claim.tokens, claim.releasableAt);
117+
// // process
118+
// feesProvisionTracker.release(serviceProvider, claim.tokens);
119+
// emit StakeClaimReleased(serviceProvider, _claimId, claim.tokens, claim.releasableAt);
108120

109-
// encode
110-
_acc = abi.encode(tokensClaimed + claim.tokens, serviceProvider);
111-
return (false, _acc);
121+
// // encode
122+
// _acc = abi.encode(tokensClaimed + claim.tokens, serviceProvider);
123+
// return (false, _acc);
124+
125+
return DataServiceFeesLib.processStakeClaim(feesProvisionTracker, claims, _claimId, _acc);
112126
}
113127

114128
/**
@@ -120,16 +134,16 @@ abstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDat
120134
delete claims[_claimId];
121135
}
122136

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;
132-
}
137+
// /**
138+
// * @notice Gets the details of a stake claim
139+
// * @param _claimId The ID of the stake claim
140+
// * @return The stake claim details
141+
// */
142+
// function _getStakeClaim(bytes32 _claimId) private view returns (StakeClaim memory) {
143+
// StakeClaim memory claim = claims[_claimId];
144+
// require(claim.createdAt != 0, DataServiceFeesClaimNotFound(_claimId));
145+
// return claim;
146+
// }
133147

134148
/**
135149
* @notice Gets the next stake claim in the linked list
@@ -141,13 +155,7 @@ abstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDat
141155
return claims[_claimId].nextClaim;
142156
}
143157

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));
152-
}
158+
// function _buildStakeClaimId(address serviceProvider, uint256 nonce) private view returns (bytes32) {
159+
// return keccak256(abi.encodePacked(address(this), serviceProvider, nonce));
160+
// }
153161
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
pragma solidity 0.8.27;
3+
4+
import { ProvisionTracker } from "./ProvisionTracker.sol";
5+
import { IDataServiceFees } from "../interfaces/IDataServiceFees.sol";
6+
import { IHorizonStaking } from "../../interfaces/IHorizonStaking.sol";
7+
import { LinkedList } from "../../libraries/LinkedList.sol";
8+
9+
library DataServiceFeesLib {
10+
using ProvisionTracker for mapping(address => uint256);
11+
using LinkedList for LinkedList.List;
12+
13+
/**
14+
* @notice Builds a stake claim ID
15+
* @param serviceProvider The address of the service provider
16+
* @param nonce A nonce of the stake claim
17+
* @return The stake claim ID
18+
*/
19+
function _buildStakeClaimId(address serviceProvider, uint256 nonce) internal view returns (bytes32) {
20+
return keccak256(abi.encodePacked(address(this), serviceProvider, nonce));
21+
}
22+
23+
struct Storage {
24+
ProvisionManagerStorage provisionManagerStorage;
25+
}
26+
27+
struct ProvisionManagerStorage {
28+
uint256 _minimumProvisionTokens;
29+
uint256 _maximumProvisionTokens;
30+
uint64 _minimumThawingPeriod;
31+
uint64 _maximumThawingPeriod;
32+
uint32 _minimumVerifierCut;
33+
uint32 _maximumVerifierCut;
34+
uint32 _delegationRatio;
35+
}
36+
37+
/**
38+
* @notice Locks stake for a service provider to back a payment.
39+
* Creates a stake claim, which is stored in a linked list by service provider.
40+
* @dev Requirements:
41+
* - The associated provision must have enough available tokens to lock the stake.
42+
*
43+
* Emits a {StakeClaimLocked} event.
44+
*
45+
* @param _serviceProvider The address of the service provider
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+
function lockStake(
50+
uint32 _delegationRatio,
51+
mapping(address => uint256) storage feesProvisionTracker,
52+
mapping(bytes32 => IDataServiceFees.StakeClaim) storage claims,
53+
mapping(address serviceProvider => LinkedList.List list) storage claimsLists,
54+
IHorizonStaking graphStaking,
55+
address _serviceProvider,
56+
uint256 _tokens,
57+
uint256 _unlockTimestamp
58+
) external {
59+
require(_tokens != 0, IDataServiceFees.DataServiceFeesZeroTokens());
60+
feesProvisionTracker.lock(graphStaking, _serviceProvider, _tokens, _delegationRatio);
61+
62+
LinkedList.List storage claimsList = claimsLists[_serviceProvider];
63+
64+
// Save item and add to list
65+
bytes32 claimId = _buildStakeClaimId(_serviceProvider, claimsList.nonce);
66+
claims[claimId] = IDataServiceFees.StakeClaim({
67+
tokens: _tokens,
68+
createdAt: block.timestamp,
69+
releasableAt: _unlockTimestamp,
70+
nextClaim: bytes32(0)
71+
});
72+
if (claimsList.count != 0) claims[claimsList.tail].nextClaim = claimId;
73+
claimsList.addTail(claimId);
74+
75+
emit IDataServiceFees.StakeClaimLocked(_serviceProvider, claimId, _tokens, _unlockTimestamp);
76+
}
77+
78+
function processStakeClaim(
79+
mapping(address serviceProvider => uint256 tokens) storage feesProvisionTracker,
80+
mapping(bytes32 claimId => IDataServiceFees.StakeClaim claim) storage claims,
81+
bytes32 _claimId,
82+
bytes memory _acc
83+
) external returns (bool, bytes memory) {
84+
IDataServiceFees.StakeClaim memory claim = claims[_claimId];
85+
require(claim.createdAt != 0, IDataServiceFees.DataServiceFeesClaimNotFound(_claimId));
86+
87+
// early exit
88+
if (claim.releasableAt > block.timestamp) {
89+
return (true, LinkedList.NULL_BYTES);
90+
}
91+
92+
// decode
93+
(uint256 tokensClaimed, address serviceProvider) = abi.decode(_acc, (uint256, address));
94+
95+
// process
96+
feesProvisionTracker.release(serviceProvider, claim.tokens);
97+
emit IDataServiceFees.StakeClaimReleased(serviceProvider, _claimId, claim.tokens, claim.releasableAt);
98+
99+
// encode
100+
_acc = abi.encode(tokensClaimed + claim.tokens, serviceProvider);
101+
return (false, _acc);
102+
}
103+
}

0 commit comments

Comments
 (0)