Skip to content

Conversation

brianmcmichael
Copy link
Contributor

It may be possible for an exec to be scheduled by a vote, and then dropped from the pause by a competing hat.

This change allows a spell to be re-scheduled in the case where it is scheduled, dropped, and then re-raised to the hat.

@brianmcmichael
Copy link
Contributor Author

Still needs a test but wanted to open the PR for discussion on whether there are any edge cases that this could introduce.

@brianmcmichael brianmcmichael requested a review from naszam January 12, 2023 18:47
Comment on lines +82 to +85
require(!done, "spell-already-cast");
require(eta == 0 ||
pause.plans(keccak256(abi.encode(action, tag, sig, eta))) == false,
"This spell has already been scheduled");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we can only use the pause.plans(keccak256(abi.encode(action, tag, sig, eta))) == false condition and remove the conditions on done and eta?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done is flipped in the spell itself. Once the spell is cast it is removed from the pause. We still want it here to prevent an executed spell from being rescheduled.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, so we can consider only removing the eta check.
Note that after eta is set it can not be set back to 0, so it will only be 0 if the spell was never scheduled. In that case the spell params will also not appear in the pause mapping (2nd condition), making the eta == 0 condition redundant.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

eta still needs to be checked here. The new eta doesn't get set until the next line, so if the ETA is not zero here it means the spell has been scheduled once. If it's not done and it's not in the pause with the old eta, then it means the spell was scheduled and dropped before the cast.

Removing the ETA check here would allow spells to be scheduled repeatedly.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess I see your point, re: checking the pause using eta 0, but in this case we avoid the additional cost of a bunch of memory loads, a keccak hash, and an external call on the most common path.

@naszam
Copy link
Contributor

naszam commented Mar 21, 2023

Still needs a test but wanted to open the PR for discussion on whether there are any edge cases that this could introduce.

We could add tests and start doing another run of reviews

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants