module arch.node.engines.commitment_behaviour; import prelude open; import arch.system.identity.identity open; import arch.node.engines.commitment_messages open; import arch.node.engines.commitment_config open; import arch.node.engines.commitment_environment open; import arch.node.types.basics open; import arch.node.types.identities open; import arch.node.types.messages open; import arch.node.types.engine open; import arch.node.types.anoma as Anoma open; type ReplyTo := mkReplyTo@{ whoAsked : Option EngineID; mailbox : Option MailboxID; }; type CommitmentActionArgument := | CommitmentActionArgumentReplyTo ReplyTo; CommitmentActionArguments : Type := List CommitmentActionArgument; CommitmentAction : Type := Action CommitmentCfg CommitmentLocalState CommitmentMailboxState CommitmentTimerHandle CommitmentActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; CommitmentActionInput : Type := ActionInput CommitmentCfg CommitmentLocalState CommitmentMailboxState CommitmentTimerHandle CommitmentActionArguments Anoma.Msg; CommitmentActionEffect : Type := ActionEffect CommitmentLocalState CommitmentMailboxState CommitmentTimerHandle Anoma.Msg Anoma.Cfg Anoma.Env; CommitmentActionExec : Type := ActionExec CommitmentCfg CommitmentLocalState CommitmentMailboxState CommitmentTimerHandle CommitmentActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; commitAction (input : CommitmentActionInput) : Option CommitmentActionEffect := let env := ActionInput.env input; cfg := ActionInput.cfg input; tt := ActionInput.trigger input; in case getEngineMsgFromTimestampedTrigger tt of | some emsg := case emsg of { | mkEngineMsg@{ msg := Anoma.MsgCommitment (MsgCommitmentRequest request); } := let signedData := Signer.sign (CommitmentCfg.signer (EngineCfg.cfg cfg)) (CommitmentCfg.backend (EngineCfg.cfg cfg)) (RequestCommitment.data request); responseMsg := mkReplyCommitment@{ commitment := signedData; err := none; }; in some mkActionEffect@{ env := env; msgs := [ mkEngineMsg@{ sender := getEngineIDFromEngineCfg cfg; target := EngineMsg.sender emsg; mailbox := some 0; msg := Anoma.MsgCommitment (MsgCommitmentReply responseMsg); }; ]; timers := []; engines := []; } | _ := none } | _ := none; commitActionLabel : CommitmentActionExec := Seq [commitAction]; CommitmentGuard : Type := Guard CommitmentCfg CommitmentLocalState CommitmentMailboxState CommitmentTimerHandle CommitmentActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; CommitmentGuardOutput : Type := GuardOutput CommitmentCfg CommitmentLocalState CommitmentMailboxState CommitmentTimerHandle CommitmentActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; CommitmentGuardEval : Type := GuardEval CommitmentCfg CommitmentLocalState CommitmentMailboxState CommitmentTimerHandle CommitmentActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; commitGuard (tt : TimestampedTrigger CommitmentTimerHandle Anoma.Msg) (cfg : EngineCfg CommitmentCfg) (env : CommitmentEnv) : Option CommitmentGuardOutput := case getEngineMsgFromTimestampedTrigger tt of | some mkEngineMsg@{msg := Anoma.MsgCommitment (MsgCommitmentRequest _)} := some mkGuardOutput@{ action := commitActionLabel; args := []; } | _ := none; CommitmentBehaviour : Type := EngineBehaviour CommitmentCfg CommitmentLocalState CommitmentMailboxState CommitmentTimerHandle CommitmentActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; commitmentBehaviour : CommitmentBehaviour := mkEngineBehaviour@{ guards := First [commitGuard]; };