@@ -16,6 +16,7 @@ import {RewardsDistributorFactory} from "../src/RewardsDistributorFactory.sol";
16
16
import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol " ;
17
17
import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol " ;
18
18
import {IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol " ;
19
+ import {SyntheticDataWorkValidator} from "../src/SyntheticDataWorkValidator.sol " ;
19
20
20
21
contract PrimeNetworkTest is Test {
21
22
using ECDSA for bytes32 ;
@@ -189,6 +190,14 @@ contract PrimeNetworkTest is Test {
189
190
return primeNetwork.createDomain (name, IWorkValidation (address (0 )), uri);
190
191
}
191
192
193
+ function newDomainWithValidation (string memory name , string memory uri , address workValidator )
194
+ public
195
+ returns (uint256 )
196
+ {
197
+ vm.startPrank (federator);
198
+ return primeNetwork.createDomain (name, IWorkValidation (workValidator), uri);
199
+ }
200
+
192
201
function newPool (uint256 domainId , string memory name , string memory uri ) public returns (uint256 ) {
193
202
vm.startPrank (pool_creator);
194
203
return computePool.createComputePool (domainId, computeManager, name, uri, 0 );
@@ -729,4 +738,52 @@ contract PrimeNetworkTest is Test {
729
738
withdrawStake (provider_good1);
730
739
assertEq (AI.balanceOf (provider_good1), startingBalance);
731
740
}
741
+
742
+ function test_stakeBlacklisting () public {
743
+ uint256 domain = newDomain ("Decentralized Training " , "https://primeintellect.ai/training/params " );
744
+ uint256 pool = newPool (domain, "INTELLECT-1 " , "https://primeintellect.ai/pools/intellect-1 " );
745
+
746
+ SyntheticDataWorkValidator workValidator = new SyntheticDataWorkValidator (domain, address (computePool), 1 days);
747
+
748
+ vm.startPrank (federator);
749
+ primeNetwork.updateDomainValidationLogic (domain, address (workValidator));
750
+
751
+ uint256 minStakeNow = stakeManager.getStakeMinimum ();
752
+ uint256 nodeComputeUnits = 1000 ;
753
+
754
+ bytes memory work_id = hex "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef " ;
755
+
756
+ startPool (pool);
757
+
758
+ addProviderWithStake (provider_good1, minStakeNow);
759
+ whitelistProvider (provider_good1);
760
+
761
+ // add stake with some extra
762
+ increaseStake (provider_good1, nodeComputeUnits * 2 * minStakeNow);
763
+ addNodeWithCompute (provider_good1, node_good1, node_good1_sk, nodeComputeUnits);
764
+
765
+ // ensure that the stake is locked by the compute units
766
+ uint256 computeLockedStake = primeNetwork.calculateMinimumStake (provider_good1, 0 );
767
+ assertEq (computeLockedStake, (nodeComputeUnits * minStakeNow) + minStakeNow);
768
+
769
+ validateNode (provider_good1, node_good1);
770
+ nodeJoin (domain, pool, provider_good1, node_good1);
771
+
772
+ computePool.submitWork (pool, node_good1, work_id);
773
+
774
+ // slash provider
775
+ uint256 stake = stakeManager.getStake (provider_good1);
776
+ vm.startPrank (validator);
777
+ primeNetwork.invalidateWork (pool, stake, work_id);
778
+
779
+ // check that stake has been slashed to 0
780
+ assertEq (stakeManager.getStake (provider_good1), 0 );
781
+
782
+ // check that provider is now blacklisted
783
+ assertEq (computeRegistry.getProvider (provider_good1).isWhitelisted, false );
784
+
785
+ // check that provider is not allowed to add new nodes to the pool
786
+ vm.expectRevert ();
787
+ nodeJoin (domain, pool, provider_good1, node_good1);
788
+ }
732
789
}
0 commit comments