Last active
December 20, 2016 22:23
-
-
Save RFV/88ec12ff9b0dd347d1b60a7849e21797 to your computer and use it in GitHub Desktop.
State Check Smart Contract function modifiers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
contract StateMachine { | |
enum Stages { | |
AcceptingBlindedBids, | |
RevealBids, | |
AnotherStage, | |
AreWeDoneYet, | |
Finished | |
} | |
// This is the current stage. | |
Stages public stage = Stages.AcceptingBlindedBids; | |
uint public creationTime = now; | |
modifier atStage(Stages _stage) { | |
if (stage != _stage) throw; | |
_ | |
} | |
function nextStage() internal { | |
stage = Stages(uint(stage) + 1); | |
} | |
// Perform timed transitions. Be sure to mention | |
// this modifier first, otherwise the guards | |
// will not take the new stage into account. | |
modifier timedTransitions() { | |
if (stage == Stages.AcceptingBlindedBids && | |
now >= creationTime + 10 days) | |
nextStage(); | |
if (stage == Stages.RevealBids && | |
now >= creationTime + 12 days) | |
nextStage(); | |
// The other stages transition by transaction | |
} | |
// Order of the modifiers matters here! | |
function bid() | |
timedTransitions | |
atStage(Stages.AcceptingBlindedBids) | |
{ | |
// We will not implement that here | |
} | |
function reveal() | |
timedTransitions | |
atStage(Stages.RevealBids) | |
{ | |
} | |
// This modifier goes to the next stage | |
// after the function is done. | |
// If you use `return` in the function, | |
// `nextStage` will not be called | |
// automatically. | |
modifier transitionNext() | |
{ | |
_ | |
nextStage(); | |
} | |
function g() | |
timedTransitions | |
atStage(Stages.AnotherStage) | |
transitionNext | |
{ | |
// If you want to use `return` here, | |
// you have to call `nextStage()` manually. | |
} | |
function h() | |
timedTransitions | |
atStage(Stages.AreWeDoneYet) | |
transitionNext | |
{ | |
} | |
function i() | |
timedTransitions | |
atStage(Stages.Finished) | |
{ | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment