Skip to content

Commit 9da00ca

Browse files
authored
Default user limits per DON family (#241)
* Default user limits per DON family * Addressed PR comments and respected global limit * Simplification of setUserDONOverride function
1 parent aa5c63c commit 9da00ca

24 files changed

+942
-341
lines changed

contracts/gas-snapshots/workflow.gas-snapshot

Lines changed: 134 additions & 132 deletions
Large diffs are not rendered by default.

contracts/src/v0.8/workflow/dev/v2/WorkflowRegistry.sol

Lines changed: 81 additions & 64 deletions
Large diffs are not rendered by default.

contracts/src/v0.8/workflow/dev/v2/test/WorkflowRegistry/WorkflowRegistry.activateWorkflow.t.sol

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ contract WorkflowRegistry_activateWorkflow is WorkflowRegistrySetup {
2828
function test_activateWorkflow_WhenTheWorkflowExistsButOwnerDoesNotEqualCaller() external whenCallerIsLinked {
2929
// It reverts with CallerIsNotWorkflowOwner
3030
vm.prank(s_owner);
31-
s_registry.setDONLimit(s_donFamily, 10, true);
31+
s_registry.setDONLimit(s_donFamily, 100, 10);
3232

3333
address user2 = makeAddr("user2");
3434
_linkOwner(s_user);
@@ -43,7 +43,7 @@ contract WorkflowRegistry_activateWorkflow is WorkflowRegistrySetup {
4343
// It returns immediately (no state change, no event)
4444
// set DON limit first
4545
vm.prank(s_owner);
46-
s_registry.setDONLimit(s_donFamily, 10, true);
46+
s_registry.setDONLimit(s_donFamily, 100, 10);
4747
_linkOwner(s_user);
4848
_upsertTestWorklow(WorkflowRegistry.WorkflowStatus.ACTIVE, false, s_user);
4949
vm.prank(s_user);
@@ -74,10 +74,10 @@ contract WorkflowRegistry_activateWorkflow is WorkflowRegistrySetup {
7474
// It reverts with MaxWorkflowsPerUserDONExceeded
7575
bytes32 wfId2 = keccak256("workflow-id2");
7676
vm.prank(s_owner);
77-
s_registry.setDONLimit(s_donFamily, 1, true);
77+
s_registry.setDONLimit(s_donFamily, 100, 1);
7878
_linkOwner(s_user);
7979

80-
// add 2 worflows 1 active and 1 paused in a don with a limit of 1
80+
// add 2 worflows 1 active and 1 paused in a don with a default user limit of 1
8181
vm.startPrank(s_user);
8282
s_registry.upsertWorkflow(
8383
s_workflowName,
@@ -107,6 +107,54 @@ contract WorkflowRegistry_activateWorkflow is WorkflowRegistrySetup {
107107
);
108108
s_registry.activateWorkflow(s_workflowId, s_donFamily);
109109
vm.stopPrank();
110+
111+
// user override to allow 2 workflows this time
112+
vm.prank(s_owner);
113+
s_registry.setUserDONOverride(s_user, s_donFamily, 2, true);
114+
115+
// now the activation of the 2nd workflow should succeed
116+
vm.startPrank(s_user);
117+
vm.expectEmit(true, true, true, false);
118+
emit WorkflowRegistry.WorkflowActivated(s_workflowId, s_user, s_donFamily, "workflow-2");
119+
s_registry.activateWorkflow(s_workflowId, s_donFamily);
120+
121+
// if we try to upsert another workflow in an active state, it should fail
122+
bytes32 wfId3 = keccak256("workflow-id3");
123+
vm.expectRevert(
124+
abi.encodeWithSelector(WorkflowRegistry.MaxWorkflowsPerUserDONExceeded.selector, s_user, s_donFamily)
125+
);
126+
s_registry.upsertWorkflow(
127+
"workflow-3",
128+
s_tag,
129+
wfId3,
130+
WorkflowRegistry.WorkflowStatus.ACTIVE,
131+
s_donFamily,
132+
s_binaryUrl,
133+
s_configUrl,
134+
s_attributes,
135+
false
136+
);
137+
138+
// but we can upsert the same workflow in paused state
139+
s_registry.upsertWorkflow(
140+
"workflow-3",
141+
s_tag,
142+
wfId3,
143+
WorkflowRegistry.WorkflowStatus.PAUSED,
144+
s_donFamily,
145+
s_binaryUrl,
146+
s_configUrl,
147+
s_attributes,
148+
false
149+
);
150+
151+
// but activating it should fail since the user override is now maxed out
152+
vm.expectRevert(
153+
abi.encodeWithSelector(WorkflowRegistry.MaxWorkflowsPerUserDONExceeded.selector, s_user, s_donFamily)
154+
);
155+
s_registry.activateWorkflow(wfId3, s_donFamily);
156+
157+
vm.stopPrank();
110158
}
111159

112160
function test_activateWorkflow_WhenNoDONLimitIsSetGloballyForTheDonFamily()
@@ -130,10 +178,10 @@ contract WorkflowRegistry_activateWorkflow is WorkflowRegistrySetup {
130178
// It activates the workflow and emits WorkflowActivated
131179
bytes32 wfId2 = keccak256("workflow-id2");
132180
vm.prank(s_owner);
133-
s_registry.setDONLimit(s_donFamily, 2, true);
181+
s_registry.setDONLimit(s_donFamily, 100, 2);
134182
_linkOwner(s_user);
135183

136-
// add 2 worflows 1 active and 1 paused in a don with a limit of 1
184+
// add 2 worflows 1 active and 1 paused in a don with a default user limit of 2
137185
vm.startPrank(s_user);
138186
s_registry.upsertWorkflow(
139187
s_workflowName,

contracts/src/v0.8/workflow/dev/v2/test/WorkflowRegistry/WorkflowRegistry.adminBatchPauseWorkflows.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ contract WorkflowRegistry_adminBatchPauseWorkflows is WorkflowRegistrySetup {
3535
workflowIds[1] = wfId2;
3636

3737
vm.prank(s_owner);
38-
s_registry.setDONLimit(s_donFamily, 10, true);
38+
s_registry.setDONLimit(s_donFamily, 100, 10);
3939
_linkOwner(s_user);
4040

4141
// add some workflows for a different user

contracts/src/v0.8/workflow/dev/v2/test/WorkflowRegistry/WorkflowRegistry.adminPauseAllByDON.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ contract WorkflowRegistry_adminPauseAllByDON is WorkflowRegistrySetup {
1919
// it pauses all of the workflows
2020
bytes32 wfId2 = keccak256("workflow-id2");
2121
vm.prank(s_owner);
22-
s_registry.setDONLimit(s_donFamily, 10, true);
22+
s_registry.setDONLimit(s_donFamily, 100, 10);
2323
_linkOwner(s_user);
2424

2525
// add some workflows

contracts/src/v0.8/workflow/dev/v2/test/WorkflowRegistry/WorkflowRegistry.adminPauseAllByOwner.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ contract WorkflowRegistry_adminPauseAllByOwner is WorkflowRegistrySetup {
1919
// it pauses all of the workflows
2020
bytes32 wfId2 = keccak256("workflow-id2");
2121
vm.prank(s_owner);
22-
s_registry.setDONLimit(s_donFamily, 10, true);
22+
s_registry.setDONLimit(s_donFamily, 100, 10);
2323
_linkOwner(s_user);
2424

2525
// add some workflows

contracts/src/v0.8/workflow/dev/v2/test/WorkflowRegistry/WorkflowRegistry.adminPauseWorkflow.t.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ contract WorkflowRegistry_adminPauseWorkflow is WorkflowRegistrySetup {
1919
function test_adminPauseWorkflow_WhenWorkflowStatusIsPAUSED() external {
2020
// setup: configure a DON limit and register a workflow as PAUSED
2121
vm.startPrank(s_owner);
22-
s_registry.setDONLimit(s_donFamily, 10, true);
22+
s_registry.setDONLimit(s_donFamily, 100, 10);
2323
(bytes32 ownerProof, bytes memory sig) = _getLinkProofSignature(s_owner);
2424
s_registry.linkOwner(s_validityTimestamp, ownerProof, sig);
2525

@@ -51,7 +51,7 @@ contract WorkflowRegistry_adminPauseWorkflow is WorkflowRegistrySetup {
5151
function test_adminPauseWorkflow_WhenWorkflowStatusIsACTIVE() external {
5252
// setup: configure a DON limit and register a workflow as ACTIVE
5353
vm.startPrank(s_owner);
54-
s_registry.setDONLimit(s_donFamily, 10, true);
54+
s_registry.setDONLimit(s_donFamily, 100, 10);
5555
(bytes32 ownerProof, bytes memory sig) = _getLinkProofSignature(s_owner);
5656
s_registry.linkOwner(s_validityTimestamp, ownerProof, sig);
5757

contracts/src/v0.8/workflow/dev/v2/test/WorkflowRegistry/WorkflowRegistry.batchActivateWorkflows.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ contract WorkflowRegistry_batchActivateWorkflows is WorkflowRegistrySetup {
9797
workflowIds[1] = wfId2;
9898

9999
vm.prank(s_owner);
100-
s_registry.setDONLimit(s_donFamily, 1, true);
100+
s_registry.setDONLimit(s_donFamily, 100, 1);
101101

102102
// add some workflows
103103
vm.startPrank(s_user);

contracts/src/v0.8/workflow/dev/v2/test/WorkflowRegistry/WorkflowRegistry.getDonConfigs.t.sol

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,20 @@ contract WorkflowRegistry_getDonConfigs is WorkflowRegistrySetup {
1616

1717
// set the don configs
1818
vm.startPrank(s_owner);
19-
s_registry.setDONLimit(s_donFamily, 100, true);
20-
s_registry.setDONLimit("fast-pool", 200, true);
21-
s_registry.setDONLimit("slow-pool", 150, true);
19+
s_registry.setDONLimit(s_donFamily, 100, 10);
20+
s_registry.setDONLimit("fast-pool", 200, 20);
21+
s_registry.setDONLimit("slow-pool", 150, 15);
2222
vm.stopPrank();
2323
WorkflowRegistry.DonConfigView[] memory list = s_registry.getDonConfigs(0, 100);
2424
assertEq(list.length, 3);
2525
assertEq(list[0].family, s_donFamily);
26-
assertEq(list[0].limit, 100);
26+
assertEq(list[0].donLimit, 100);
27+
assertEq(list[0].defaultUserLimit, 10);
2728
assertEq(list[1].family, "fast-pool");
28-
assertEq(list[1].limit, 200);
29+
assertEq(list[1].donLimit, 200);
30+
assertEq(list[1].defaultUserLimit, 20);
2931
assertEq(list[2].family, "slow-pool");
30-
assertEq(list[2].limit, 150);
32+
assertEq(list[2].donLimit, 150);
33+
assertEq(list[2].defaultUserLimit, 15);
3134
}
3235
}

contracts/src/v0.8/workflow/dev/v2/test/WorkflowRegistry/WorkflowRegistry.getEvents.t.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ contract WorkflowRegistry_getEvents is WorkflowRegistrySetup {
1313

1414
modifier whenThereIsMoreThan1Event() {
1515
vm.startPrank(s_owner);
16-
s_registry.setDONLimit(s_donFamily, 100, true);
17-
s_registry.setDONLimit(s_donFamily, 200, true);
18-
s_registry.setDONLimit(s_donFamily, 150, true); // should push three events to event records
16+
s_registry.setDONLimit(s_donFamily, 100, 10);
17+
s_registry.setDONLimit(s_donFamily, 200, 20);
18+
s_registry.setDONLimit(s_donFamily, 150, 15); // should push three events to event records
1919
vm.stopPrank();
2020
_;
2121
}

0 commit comments

Comments
 (0)