diff --git a/docs/arch/node/engines/commitment_behaviour.juvix.md b/docs/arch/node/engines/commitment_behaviour.juvix.md index 1761981fb50..d2cd577712f 100644 --- a/docs/arch/node/engines/commitment_behaviour.juvix.md +++ b/docs/arch/node/engines/commitment_behaviour.juvix.md @@ -20,6 +20,7 @@ tags: import arch.node.engines.commitment_messages open; import arch.node.engines.commitment_config open; import arch.node.engines.commitment_environment open; + import arch.node.utils open; import arch.node.types.basics open; import arch.node.types.identities open; import arch.node.types.messages open; @@ -248,23 +249,11 @@ commitAction (CommitmentCfg.signer (EngineCfg.cfg cfg)) (CommitmentCfg.backend (EngineCfg.cfg cfg)) (RequestCommitment.data request); - responseMsg := mkReplyCommitment@{ + responseMsg := Anoma.MsgCommitment (MsgCommitmentReply 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 := [] - } + }) + in some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) responseMsg) | _ := none } | _ := none diff --git a/docs/arch/node/engines/decryption_behaviour.juvix.md b/docs/arch/node/engines/decryption_behaviour.juvix.md index 12af2f7df23..007efd350f8 100644 --- a/docs/arch/node/engines/decryption_behaviour.juvix.md +++ b/docs/arch/node/engines/decryption_behaviour.juvix.md @@ -18,6 +18,7 @@ tags: import prelude open; import arch.node.types.messages open; import arch.system.identity.identity open; + import arch.node.utils open; import arch.node.types.engine open; import arch.node.engines.decryption_config open; import arch.node.engines.decryption_environment open; @@ -261,7 +262,7 @@ decryptAction (DecryptionCfg.decryptor (EngineCfg.cfg cfg)) (DecryptionCfg.backend (EngineCfg.cfg cfg)) (RequestDecryption.data request); - responseMsg := case decryptedData of { + responseMsg' := case decryptedData of { | none := mkReplyDecryption@{ data := emptyByteString; err := some "Decryption Failed" @@ -270,20 +271,9 @@ decryptAction data := plaintext; err := none } - } - in some mkActionEffect@{ - env := env; - msgs := [ - mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgDecryption (MsgDecryptionReply responseMsg) - } - ]; - timers := []; - engines := [] - } + }; + responseMsg := Anoma.MsgDecryption (MsgDecryptionReply responseMsg'); + in some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) responseMsg) | _ := none } | _ := none diff --git a/docs/arch/node/engines/encryption_behaviour.juvix.md b/docs/arch/node/engines/encryption_behaviour.juvix.md index c5c377f1c2b..ac4157186d3 100644 --- a/docs/arch/node/engines/encryption_behaviour.juvix.md +++ b/docs/arch/node/engines/encryption_behaviour.juvix.md @@ -21,6 +21,7 @@ tags: import arch.node.engines.encryption_messages open; import arch.node.engines.encryption_config open; import arch.node.engines.reads_for_messages open; + import arch.node.utils open; import arch.node.types.anoma as Anoma open; import arch.node.types.engine open; import arch.node.types.identities open; @@ -343,26 +344,14 @@ encryptAction | Anoma.MsgEncryption (MsgEncryptionRequest (mkRequestEncrypt data externalIdentity useReadsFor)) := case useReadsFor of { | false := - some mkActionEffect@{ - env := env; - msgs := [ - mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgEncryption (MsgEncryptionReply ( - mkReplyEncrypt@{ - ciphertext := Encryptor.encrypt - (EncryptionCfg.encryptor (EngineCfg.cfg cfg) Set.empty externalIdentity) - (EncryptionCfg.backend (EngineCfg.cfg cfg)) - data; - err := none - })) - } - ]; - timers := []; - engines := [] - } + let responseMsg := Anoma.MsgEncryption (MsgEncryptionReply mkReplyEncrypt@{ + ciphertext := Encryptor.encrypt + (EncryptionCfg.encryptor (EngineCfg.cfg cfg) Set.empty externalIdentity) + (EncryptionCfg.backend (EngineCfg.cfg cfg)) + data; + err := none + }) + in some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) responseMsg) | true := let existingRequests := Map.lookup externalIdentity (EncryptionLocalState.pendingRequests localState); newPendingList := case existingRequests of { @@ -372,23 +361,17 @@ encryptAction newLocalState := localState@EncryptionLocalState{ pendingRequests := Map.insert externalIdentity newPendingList (EncryptionLocalState.pendingRequests localState) }; + responseMsg := Anoma.MsgReadsFor (MsgQueryReadsForEvidenceRequest + mkRequestQueryReadsForEvidence@{ + externalIdentity := externalIdentity + }) in some mkActionEffect@{ env := env@EngineEnv{ localState := newLocalState }; msgs := case existingRequests of { | some _ := [] - | none := [ - mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EncryptionCfg.readsForEngineAddress (EngineCfg.cfg cfg); - mailbox := some 0; - msg := Anoma.MsgReadsFor (MsgQueryReadsForEvidenceRequest ( - mkRequestQueryReadsForEvidence@{ - externalIdentity := externalIdentity - })) - } - ] + | none := [defaultReplyMsg cfg (EncryptionCfg.readsForEngineAddress (EngineCfg.cfg cfg)) responseMsg] }; timers := []; engines := [] @@ -442,20 +425,15 @@ handleReadsForReplyAction }; msgs := map (\{req := let whoAsked := fst req; - data := snd req; - in mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := whoAsked; - mailbox := some 0; - msg := Anoma.MsgEncryption (MsgEncryptionReply ( - mkReplyEncrypt@{ - ciphertext := Encryptor.encrypt - (EncryptionCfg.encryptor (EngineCfg.cfg cfg) evidence externalIdentity) - (EncryptionCfg.backend (EngineCfg.cfg cfg)) - data; - err := none - })) - }}) + data := snd req; + responseMsg := Anoma.MsgEncryption (MsgEncryptionReply mkReplyEncrypt@{ + ciphertext := Encryptor.encrypt + (EncryptionCfg.encryptor (EngineCfg.cfg cfg) evidence externalIdentity) + (EncryptionCfg.backend (EngineCfg.cfg cfg)) + data; + err := none + }) + in defaultReplyMsg cfg whoAsked responseMsg}) reqs; timers := []; engines := [] diff --git a/docs/arch/node/engines/executor_behaviour.juvix.md b/docs/arch/node/engines/executor_behaviour.juvix.md index 0f14f277c15..2153ed7e1ba 100644 --- a/docs/arch/node/engines/executor_behaviour.juvix.md +++ b/docs/arch/node/engines/executor_behaviour.juvix.md @@ -21,6 +21,7 @@ tags: import arch.node.engines.shard_messages open; import prelude open; + import arch.node.utils open; import arch.node.types.basics open; import arch.node.types.identities open; import arch.node.types.messages open; @@ -292,12 +293,7 @@ processReadAction | some (MsgShard (ShardMsgKVSRead (mkKVSReadMsg@{key := readKey; data := readValue}))) := let envelope (target : EngineID) (msg : Anoma.PreMsg KVSKey KVSDatum Executable) : EngineMsg (Anoma.PreMsg KVSKey KVSDatum Executable) := - mkEngineMsg@{ - sender := getEngineIDFromEngineCfg (ActionInput.cfg input); - target := target; - mailbox := some 0; - msg := msg - }; + defaultReplyMsg (ActionInput.cfg input) target msg; local := EngineEnv.localState env; reads := ExecutorLocalState.completed_reads local; writes := ExecutorLocalState.completed_writes local; diff --git a/docs/arch/node/engines/identity_management_behaviour.juvix.md b/docs/arch/node/engines/identity_management_behaviour.juvix.md index 35400940767..090a2156710 100644 --- a/docs/arch/node/engines/identity_management_behaviour.juvix.md +++ b/docs/arch/node/engines/identity_management_behaviour.juvix.md @@ -23,6 +23,7 @@ tags: import arch.node.engines.identity_management_environment open; import arch.node.engines.identity_management_messages open; import arch.node.engines.identity_management_config open; + import arch.node.utils open; import arch.node.types.anoma as Anoma open; import arch.node.types.engine open; import arch.node.types.engine_environment open; @@ -525,6 +526,7 @@ generateIdentityAction : Option IdentityManagementActionEffect := let env := ActionInput.env input; + cfg := ActionInput.cfg input; local := EngineEnv.localState env; identities := IdentityManagementLocalState.identities local; trigger := ActionInput.trigger input; @@ -533,23 +535,15 @@ generateIdentityAction let whoAsked := EngineMsg.sender emsg; in case Map.lookup whoAsked identities of { | some _ := - some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg (ActionInput.cfg input); - target := whoAsked; - mailbox := some 0; - msg := MsgIdentityManagement (MsgIdentityManagementGenerateIdentityReply - (mkReplyGenerateIdentity@{ - commitmentEngine := none; - decryptionEngine := none; - externalIdentity := whoAsked; - err := some "Identity already exists" - })) - }]; - timers := []; - engines := [] - } + let responseMsg := + MsgIdentityManagement (MsgIdentityManagementGenerateIdentityReply + (mkReplyGenerateIdentity@{ + commitmentEngine := none; + decryptionEngine := none; + externalIdentity := whoAsked; + err := some "Identity already exists" + })); + in some (defaultReplyActionEffect env cfg whoAsked responseMsg) | none := case emsg of { | mkEngineMsg@{msg := Anoma.MsgIdentityManagement (MsgIdentityManagementGenerateIdentityRequest (mkRequestGenerateIdentity backend' params' capabilities'))} := @@ -615,6 +609,7 @@ connectIdentityAction : Option IdentityManagementActionEffect := let env := ActionInput.env input; + cfg := ActionInput.cfg input; local := EngineEnv.localState env; identities := IdentityManagementLocalState.identities local; trigger := ActionInput.trigger input; @@ -623,43 +618,27 @@ connectIdentityAction let whoAsked := EngineMsg.sender emsg; in case Map.lookup whoAsked identities of { | some _ := - some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg (ActionInput.cfg input); - target := whoAsked; - mailbox := some 0; - msg := MsgIdentityManagement (MsgIdentityManagementConnectIdentityReply - (mkConnectIdentityReply@{ - commitmentEngine := none; - decryptionEngine := none; - err := some "Identity already exists" - })) - }]; - timers := []; - engines := [] - } + let responseMsg := + MsgIdentityManagement (MsgIdentityManagementConnectIdentityReply + (mkConnectIdentityReply@{ + commitmentEngine := none; + decryptionEngine := none; + err := some "Identity already exists" + })); + in some (defaultReplyActionEffect env cfg whoAsked responseMsg) | none := case emsg of { | mkEngineMsg@{msg := Anoma.MsgIdentityManagement (MsgIdentityManagementConnectIdentityRequest (mkRequestConnectIdentity externalIdentity' backend' capabilities'))} := case Map.lookup externalIdentity' identities of { | none := - some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg (ActionInput.cfg input); - target := whoAsked; - mailbox := some 0; - msg := MsgIdentityManagement (MsgIdentityManagementConnectIdentityReply - (mkConnectIdentityReply@{ - commitmentEngine := none; - decryptionEngine := none; - err := some "External identity not found" - })) - }]; - timers := []; - engines := [] - } + let responseMsg := + MsgIdentityManagement (MsgIdentityManagementConnectIdentityReply + (mkConnectIdentityReply@{ + commitmentEngine := none; + decryptionEngine := none; + err := some "External identity not found" + })); + in some (defaultReplyActionEffect env cfg whoAsked responseMsg) | some externalIdentityInfo := if | isSubsetCapabilities capabilities' (IdentityInfo.capabilities externalIdentityInfo) := @@ -671,39 +650,23 @@ connectIdentityAction newEnv' := env@EngineEnv{ localState := newLocalState }; - in some mkActionEffect@{ - env := newEnv'; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg (ActionInput.cfg input); - target := whoAsked; - mailbox := some 0; - msg := MsgIdentityManagement (MsgIdentityManagementConnectIdentityReply - (mkConnectIdentityReply@{ - commitmentEngine := IdentityInfo.commitmentEngine newIdentityInfo; - decryptionEngine := IdentityInfo.decryptionEngine newIdentityInfo; - err := none - })) - }]; - timers := []; - engines := [] - } + responseMsg := + MsgIdentityManagement (MsgIdentityManagementConnectIdentityReply + (mkConnectIdentityReply@{ + commitmentEngine := IdentityInfo.commitmentEngine newIdentityInfo; + decryptionEngine := IdentityInfo.decryptionEngine newIdentityInfo; + err := none + })); + in some (defaultReplyActionEffect newEnv' cfg whoAsked responseMsg) | else := - some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg (ActionInput.cfg input); - target := whoAsked; - mailbox := some 0; - msg := MsgIdentityManagement (MsgIdentityManagementConnectIdentityReply - (mkConnectIdentityReply@{ - commitmentEngine := none; - decryptionEngine := none; - err := some "Capabilities not available" - })) - }]; - timers := []; - engines := [] - } + let responseMsg := + MsgIdentityManagement (MsgIdentityManagementConnectIdentityReply + (mkConnectIdentityReply@{ + commitmentEngine := none; + decryptionEngine := none; + err := some "Capabilities not available" + })); + in some (defaultReplyActionEffect env cfg whoAsked responseMsg) } | _ := none } @@ -734,6 +697,7 @@ deleteIdentityAction : Option IdentityManagementActionEffect := let env := ActionInput.env input; + cfg := ActionInput.cfg input; local := EngineEnv.localState env; identities := IdentityManagementLocalState.identities local; trigger := ActionInput.trigger input; @@ -744,20 +708,12 @@ deleteIdentityAction | mkEngineMsg@{msg := Anoma.MsgIdentityManagement (MsgIdentityManagementDeleteIdentityRequest (mkRequestDeleteIdentity externalIdentity backend'))} := case Map.lookup externalIdentity identities of { | none := - some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg (ActionInput.cfg input); - target := whoAsked; - mailbox := some 0; - msg := MsgIdentityManagement (MsgIdentityManagementDeleteIdentityReply - (mkReplyDeleteIdentity@{ - err := some "Identity does not exist" - })) - }]; - timers := []; - engines := [] - } + let responseMsg := + MsgIdentityManagement (MsgIdentityManagementDeleteIdentityReply + (mkReplyDeleteIdentity@{ + err := some "Identity does not exist" + })); + in some (defaultReplyActionEffect env cfg whoAsked responseMsg) | some _ := let updatedIdentities := Map.delete externalIdentity identities; newLocalState := local@IdentityManagementLocalState{ @@ -766,20 +722,12 @@ deleteIdentityAction newEnv' := env@EngineEnv{ localState := newLocalState }; - in some mkActionEffect@{ - env := newEnv'; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg (ActionInput.cfg input); - target := whoAsked; - mailbox := some 0; - msg := MsgIdentityManagement (MsgIdentityManagementDeleteIdentityReply - (mkReplyDeleteIdentity@{ - err := none - })) - }]; - timers := []; - engines := [] - } + responseMsg := + MsgIdentityManagement (MsgIdentityManagementDeleteIdentityReply + (mkReplyDeleteIdentity@{ + err := none + })); + in some (defaultReplyActionEffect newEnv' cfg whoAsked responseMsg) } | _ := none } diff --git a/docs/arch/node/engines/local_key_value_storage_behaviour.juvix.md b/docs/arch/node/engines/local_key_value_storage_behaviour.juvix.md index 9bf88d989a2..21bee8db4d0 100644 --- a/docs/arch/node/engines/local_key_value_storage_behaviour.juvix.md +++ b/docs/arch/node/engines/local_key_value_storage_behaviour.juvix.md @@ -20,6 +20,7 @@ tags: import arch.node.engines.local_key_value_storage_environment open; import prelude open; + import arch.node.utils open; import arch.node.types.basics open; import arch.node.types.identities open; import arch.node.types.messages open; @@ -152,21 +153,12 @@ getValueAction | some emsg := case emsg of { | mkEngineMsg@{msg := Anoma.MsgLocalKVStorage (LocalKVStorageMsgGetValueRequest req)} := - some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgLocalKVStorage (LocalKVStorageMsgGetValueReply - (mkGetValueKVStoreReply@{ - key := GetValueKVStoreRequest.key req; - value := fromOption (Map.lookup (GetValueKVStoreRequest.key req) storage) "" - })) - }]; - timers := []; - engines := []; - } + let responseMsg := Anoma.MsgLocalKVStorage (LocalKVStorageMsgGetValueReply + (mkGetValueKVStoreReply@{ + key := GetValueKVStoreRequest.key req; + value := fromOption (Map.lookup (GetValueKVStoreRequest.key req) storage) "" + })); + in some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) responseMsg) | _ := none } | _ := none @@ -223,17 +215,14 @@ setValueAction success := true })) }; - notificationMsg := \{target := mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := target; - mailbox := some 0; - msg := Anoma.MsgLocalKVStorage (LocalKVStorageMsgValueChanged + notificationMsg := \{target := defaultReplyMsg cfg target + (Anoma.MsgLocalKVStorage (LocalKVStorageMsgValueChanged (mkValueChangedKVStore@{ key := key; value := value; timestamp := newTime - })) - }}; + }))) + }; notificationMsgs := map notificationMsg (getNotificationTargets key); in some mkActionEffect@{ env := newEnv; @@ -296,17 +285,14 @@ deleteValueAction success := true })) }; - notificationMsg := \{target := mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := target; - mailbox := some 0; - msg := Anoma.MsgLocalKVStorage (LocalKVStorageMsgValueChanged + notificationMsg := \{target := defaultReplyMsg cfg target + (Anoma.MsgLocalKVStorage (LocalKVStorageMsgValueChanged (mkValueChangedKVStore@{ key := key; value := ""; timestamp := newTime - })) - }}; + }))) + }; notificationMsgs := map notificationMsg (getNotificationTargets key); in some mkActionEffect@{ env := newEnv; diff --git a/docs/arch/node/engines/local_time_series_storage_behaviour.juvix.md b/docs/arch/node/engines/local_time_series_storage_behaviour.juvix.md index dee95cf7adb..d41557afa8c 100644 --- a/docs/arch/node/engines/local_time_series_storage_behaviour.juvix.md +++ b/docs/arch/node/engines/local_time_series_storage_behaviour.juvix.md @@ -20,6 +20,7 @@ tags: import arch.node.engines.local_time_series_storage_environment open; import prelude open; + import arch.node.utils open; import arch.node.types.basics open; import arch.node.types.identities open; import arch.node.types.messages open; @@ -152,21 +153,13 @@ getDataAction } := let result := queryDB (LocalTSStorageLocalState.db local) (GetDataTSStorageDBRequest.query request); in case result of { - | some data := some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := sender; - mailbox := some 0; - msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgGetReply - mkGetDataTSStorageDBReply@{ - query := GetDataTSStorageDBRequest.query request; - data := data; - }) - }]; - timers := []; - engines := []; - } + | some data := + let responseMsg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgGetReply + mkGetDataTSStorageDBReply@{ + query := GetDataTSStorageDBRequest.query request; + data := data; + }); + in some (defaultReplyActionEffect env cfg sender responseMsg) | none := none } | _ := none @@ -229,17 +222,14 @@ recordDataAction success := true; }) }; - notificationMsg := \{target := mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := target; - mailbox := some 0; - msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgDataChanged - (mkDataChangedTSStorageDB@{ + notificationMsg := \{target := defaultReplyMsg cfg target + (Anoma.MsgLocalTSStorage (LocalTSStorageMsgDataChanged + mkDataChangedTSStorageDB@{ query := query; data := value; timestamp := newTime })) - }}; + }; notificationMsgs := map notificationMsg (getNotificationTargets query); in some mkActionEffect@{ env := newEnv; @@ -247,21 +237,13 @@ recordDataAction timers := []; engines := []; } - | none := some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := sender; - mailbox := some 0; - msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgRecordReply - mkRecordDataTSStorageDBReply@{ - query := query; - success := false; - }) - }]; - timers := []; - engines := []; - } + | none := + let responseMsg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgDeleteReply + mkDeleteDataTSStorageDBReply@{ + query := query; + success := false; + }); + in some (defaultReplyActionEffect env cfg sender responseMsg) } | _ := none }; @@ -323,17 +305,14 @@ deleteDataAction success := true; }) }; - notificationMsg := \{target := mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := target; - mailbox := some 0; - msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgDataChanged - (mkDataChangedTSStorageDB@{ + notificationMsg := \{target := defaultReplyMsg cfg target + (Anoma.MsgLocalTSStorage (LocalTSStorageMsgDataChanged + mkDataChangedTSStorageDB@{ query := query; data := value; timestamp := newTime })) - }}; + }; notificationMsgs := map notificationMsg (getNotificationTargets query); in some mkActionEffect@{ env := newEnv; @@ -341,21 +320,13 @@ deleteDataAction timers := []; engines := []; } - | none := some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := sender; - mailbox := some 0; - msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgDeleteReply - mkDeleteDataTSStorageDBReply@{ - query := query; - success := false; - }) - }]; - timers := []; - engines := []; - } + | none := + let responseMsg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgDeleteReply + mkDeleteDataTSStorageDBReply@{ + query := query; + success := false; + }); + in some (defaultReplyActionEffect env cfg sender responseMsg) } | _ := none }; diff --git a/docs/arch/node/engines/mempool_worker_behaviour.juvix.md b/docs/arch/node/engines/mempool_worker_behaviour.juvix.md index befa1d014fd..dfe5762cae5 100644 --- a/docs/arch/node/engines/mempool_worker_behaviour.juvix.md +++ b/docs/arch/node/engines/mempool_worker_behaviour.juvix.md @@ -26,6 +26,7 @@ tags: import prelude open; import Stdlib.Data.Nat open; import Stdlib.Data.List as List; + import arch.node.utils open; import arch.node.types.basics open; import arch.node.types.identities open; import arch.node.types.messages open; @@ -560,16 +561,11 @@ lockAcquiredAction newEnv := env@EngineEnv{localState := newState}; allShards := getAllShards (MempoolWorkerLocalState.transactions local); makeUpdateMsg (target : EngineID) (isWrite : Bool) (timestamp : TxFingerprint) : EngineMsg (Anoma.PreMsg KVSKey KVSDatum Executable) := - mkEngineMsg@{ - sender := getEngineIDFromEngineCfg (ActionInput.cfg input); - target := target; - mailbox := some 0; - msg := Anoma.MsgShard (ShardMsgUpdateSeenAll - (mkUpdateSeenAllMsg@{ - timestamp := timestamp; - write := isWrite - })) - }; + (defaultReplyMsg (ActionInput.cfg input) target (Anoma.MsgShard (ShardMsgUpdateSeenAll + (mkUpdateSeenAllMsg@{ + timestamp := timestamp; + write := isWrite + })))); writeMessages := map \{shard := makeUpdateMsg shard true maxConsecutiveWrite} (Set.toList allShards); readMessages := map \{shard := makeUpdateMsg shard false maxConsecutiveRead} (Set.toList allShards); in some mkActionEffect@{ diff --git a/docs/arch/node/engines/naming_behaviour.juvix.md b/docs/arch/node/engines/naming_behaviour.juvix.md index 2356efdb26f..468f5306e27 100644 --- a/docs/arch/node/engines/naming_behaviour.juvix.md +++ b/docs/arch/node/engines/naming_behaviour.juvix.md @@ -16,6 +16,7 @@ tags: module arch.node.engines.naming_behaviour; import prelude open; + import arch.node.utils open; import arch.node.types.messages open; import arch.node.types.engine open; import arch.node.types.identities open; @@ -393,22 +394,12 @@ resolveNameAction identities := Set.fromList (map \{evidence := IdentityNameEvidence.externalIdentity evidence } (Set.toList matchingEvidence)); - responseMsg := mkReplyResolveName@{ + responseMsg := Anoma.MsgNaming (MsgNamingResolveNameReply mkReplyResolveName@{ externalIdentities := identities; err := none - } + }) in case getEngineMsgFromTimestampedTrigger tt of { - | some emsg := some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgNaming (MsgNamingResolveNameReply responseMsg) - }]; - timers := []; - engines := [] - } + | some emsg := some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) responseMsg) | _ := none } | _ := none @@ -462,7 +453,7 @@ submitNameEvidenceAction } | false := env }; - responseMsg := mkReplySubmitNameEvidence@{ + responseMsg := Anoma.MsgNaming (MsgNamingSubmitNameEvidenceReply mkReplySubmitNameEvidence@{ err := case isValid of { | false := some "Invalid evidence" | true := case alreadyExists of { @@ -470,19 +461,9 @@ submitNameEvidenceAction | false := none } } - } + }) in case getEngineMsgFromTimestampedTrigger tt of { - | some emsg := some mkActionEffect@{ - env := newEnv; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgNaming (MsgNamingSubmitNameEvidenceReply responseMsg) - }]; - timers := []; - engines := [] - } + | some emsg := some (defaultReplyActionEffect newEnv cfg (EngineMsg.sender emsg) responseMsg) | _ := none } | _ := none @@ -524,23 +505,13 @@ queryNameEvidenceAction relevantEvidence := AVLTree.filter \{evidence := isEqual (Ord.cmp (IdentityNameEvidence.externalIdentity evidence) extId) } (NamingLocalState.evidenceStore localState); - responseMsg := mkReplyQueryNameEvidence@{ + responseMsg := Anoma.MsgNaming (MsgNamingQueryNameEvidenceReply mkReplyQueryNameEvidence@{ externalIdentity := extId; evidence := relevantEvidence; err := none - } + }) in case getEngineMsgFromTimestampedTrigger tt of { - | some emsg := some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgNaming (MsgNamingQueryNameEvidenceReply responseMsg) - }]; - timers := []; - engines := [] - } + | some emsg := some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) responseMsg) | _ := none } | _ := none diff --git a/docs/arch/node/engines/reads_for_behaviour.juvix.md b/docs/arch/node/engines/reads_for_behaviour.juvix.md index ea52faa32fb..d71232a2d25 100644 --- a/docs/arch/node/engines/reads_for_behaviour.juvix.md +++ b/docs/arch/node/engines/reads_for_behaviour.juvix.md @@ -16,6 +16,7 @@ tags: module arch.node.engines.reads_for_behaviour; import prelude open; + import arch.node.utils open; import arch.node.types.messages open; import arch.node.types.engine open; import arch.node.types.identities open; @@ -167,21 +168,11 @@ readsForQueryAction isEqual (Ord.cmp (ReadsForEvidence.fromIdentity evidence) identityA) && isEqual (Ord.cmp (ReadsForEvidence.toIdentity evidence) identityB) } (Set.toList (ReadsForLocalState.evidenceStore localState))); - responseMsg := mkReplyReadsFor@{ + responseMsg := Anoma.MsgReadsFor (MsgReadsForReply mkReplyReadsFor@{ readsFor := hasEvidence; err := none - } - in some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgReadsFor (MsgReadsForReply responseMsg) - }]; - timers := []; - engines := [] - } + }) + in some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) responseMsg) | _ := none } | _ := none @@ -221,47 +212,25 @@ submitEvidenceAction case verifyEvidence evidence of { | true := case isElement \{a b := a && b} true (map \{e := isEqual (Ord.cmp e evidence)} (Set.toList (ReadsForLocalState.evidenceStore localState))) of { - | true := - some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgReadsFor (MsgSubmitReadsForEvidenceReply (mkReplySubmitReadsForEvidence (some "Evidence already exists."))) - }]; - timers := []; - engines := [] - } + | true := some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) + (Anoma.MsgReadsFor + (MsgSubmitReadsForEvidenceReply + (mkReplySubmitReadsForEvidence + (some "Evidence already exists."))))) | false := let newEvidenceStore := Set.insert evidence (ReadsForLocalState.evidenceStore localState); updatedLocalState := localState@ReadsForLocalState{evidenceStore := newEvidenceStore}; - newEnv := env@EngineEnv{localState := updatedLocalState} - in some mkActionEffect@{ - env := newEnv; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgReadsFor (MsgSubmitReadsForEvidenceReply (mkReplySubmitReadsForEvidence none)) - }]; - timers := []; - engines := [] - } - } - | false := - some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgReadsFor (MsgSubmitReadsForEvidenceReply (mkReplySubmitReadsForEvidence (some "Invalid evidence provided."))) - }]; - timers := []; - engines := [] + newEnv := env@EngineEnv{localState := updatedLocalState}; + responseMsg := Anoma.MsgReadsFor (MsgSubmitReadsForEvidenceReply (mkReplySubmitReadsForEvidence none)) + in some (defaultReplyActionEffect newEnv cfg (EngineMsg.sender emsg) responseMsg) } + | false := some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) + (Anoma.MsgReadsFor + (MsgSubmitReadsForEvidenceReply + (mkReplySubmitReadsForEvidence + (some "Invalid evidence provided.")))) + ) } | _ := none } @@ -304,22 +273,12 @@ queryEvidenceAction isEqual (Ord.cmp (ReadsForEvidence.fromIdentity evidence) identity) || isEqual (Ord.cmp (ReadsForEvidence.toIdentity evidence) identity) } (ReadsForLocalState.evidenceStore localState); - responseMsg := mkReplyQueryReadsForEvidence@{ + responseMsg := Anoma.MsgReadsFor (MsgQueryReadsForEvidenceReply mkReplyQueryReadsForEvidence@{ externalIdentity := identity; evidence := relevantEvidence; err := none - } - in some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgReadsFor (MsgQueryReadsForEvidenceReply responseMsg) - }]; - timers := []; - engines := [] - } + }) + in some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) responseMsg) | _ := none } | _ := none diff --git a/docs/arch/node/engines/shard_behaviour.juvix.md b/docs/arch/node/engines/shard_behaviour.juvix.md index f596b937ba2..936f14d6484 100644 --- a/docs/arch/node/engines/shard_behaviour.juvix.md +++ b/docs/arch/node/engines/shard_behaviour.juvix.md @@ -22,6 +22,7 @@ tags: import Stdlib.Data.Nat open; import Stdlib.Data.List as List; import prelude open; + import arch.node.utils open; import arch.node.types.basics open; import arch.node.types.identities open; import arch.node.types.messages open; @@ -736,12 +737,10 @@ acquireLockAction in some mkActionEffect@{ env := newEnv; msgs := - mkEngineMsg@{ - sender := getEngineIDFromEngineCfg (ActionInput.cfg input); - target := KVSAcquireLockMsg.worker lockMsg; - mailbox := some 0; - msg := Anoma.MsgShard (ShardMsgKVSLockAcquired mkKVSLockAcquiredMsg@{timestamp := KVSAcquireLockMsg.timestamp lockMsg}) - } :: snd propagationResult; + (defaultReplyMsg (ActionInput.cfg input) + (KVSAcquireLockMsg.worker lockMsg) + (Anoma.MsgShard (ShardMsgKVSLockAcquired mkKVSLockAcquiredMsg@{timestamp := KVSAcquireLockMsg.timestamp lockMsg})) + ) :: snd propagationResult; timers := []; engines := [] } @@ -849,21 +848,16 @@ processReadRequestAction case findMostRecentWrite updatedDag key timestamp of { | none := none | some data := - let readMsg := mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := sender; - mailbox := some 0; - msg := Anoma.MsgShard (ShardMsgKVSRead mkKVSReadMsg@{ + let responsMsg := Anoma.MsgShard (ShardMsgKVSRead mkKVSReadMsg@{ timestamp := timestamp; key := key; data := data - }) - }; + }); newLocal := local@ShardLocalState{ dagStructure := updatedDag }; newEnv := env@EngineEnv{ localState := newLocal }; in some mkActionEffect@{ env := newEnv; - msgs := [readMsg]; + msgs := [defaultReplyMsg cfg sender responsMsg]; timers := []; engines := [] } diff --git a/docs/arch/node/engines/signs_for_behaviour.juvix.md b/docs/arch/node/engines/signs_for_behaviour.juvix.md index 81ac6b52d1b..f50ef300057 100644 --- a/docs/arch/node/engines/signs_for_behaviour.juvix.md +++ b/docs/arch/node/engines/signs_for_behaviour.juvix.md @@ -16,6 +16,7 @@ tags: module arch.node.engines.signs_for_behaviour; import prelude open; + import arch.node.utils open; import arch.node.types.messages open; import arch.node.types.engine open; import arch.node.types.identities open; @@ -166,21 +167,11 @@ signsForQueryAction isEqual (Ord.cmp (SignsForEvidence.fromIdentity evidence) externalIdentityA) && isEqual (Ord.cmp (SignsForEvidence.toIdentity evidence) externalIdentityB) } (Set.toList (SignsForLocalState.evidenceStore localState))); - responseMsg := mkReplySignsFor@{ + responseMsg := Anoma.MsgSignsFor (MsgSignsForReply mkReplySignsFor@{ signsFor := hasEvidence; err := none - }; - in some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := msgSender; - mailbox := some 0; - msg := Anoma.MsgSignsFor (MsgSignsForReply responseMsg) - }]; - timers := []; - engines := [] - } + }); + in some (defaultReplyActionEffect env cfg msgSender responseMsg) | _ := none } ``` @@ -224,20 +215,10 @@ submitEvidenceAction in case alreadyExists of { | true := let - responseMsg := mkReplySubmitSignsForEvidence@{ + responseMsg := Anoma.MsgSignsFor (MsgSubmitSignsForEvidenceReply mkReplySubmitSignsForEvidence@{ err := some "Evidence already exists." - }; - in some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := msgSender; - mailbox := some 0; - msg := Anoma.MsgSignsFor (MsgSubmitSignsForEvidenceReply responseMsg) - }]; - timers := []; - engines := [] - } + }); + in some (defaultReplyActionEffect env cfg msgSender responseMsg) | false := let newEvidenceStore := Set.insert evidence (SignsForLocalState.evidenceStore localState); @@ -247,37 +228,17 @@ submitEvidenceAction newEnv := env@EngineEnv{ localState := updatedLocalState }; - responseMsg := mkReplySubmitSignsForEvidence@{ + responseMsg := Anoma.MsgSignsFor (MsgSubmitSignsForEvidenceReply mkReplySubmitSignsForEvidence@{ err := none - }; - in some mkActionEffect@{ - env := newEnv; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := msgSender; - mailbox := some 0; - msg := Anoma.MsgSignsFor (MsgSubmitSignsForEvidenceReply responseMsg) - }]; - timers := []; - engines := [] - } + }); + in some (defaultReplyActionEffect newEnv cfg msgSender responseMsg) } | false := let - responseMsg := mkReplySubmitSignsForEvidence@{ + responseMsg := Anoma.MsgSignsFor (MsgSubmitSignsForEvidenceReply mkReplySubmitSignsForEvidence@{ err := some "Invalid evidence provided." - }; - in some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := msgSender; - mailbox := some 0; - msg := Anoma.MsgSignsFor (MsgSubmitSignsForEvidenceReply responseMsg) - }]; - timers := []; - engines := [] - } + }); + in some (defaultReplyActionEffect env cfg msgSender responseMsg) } | _ := none } @@ -319,22 +280,12 @@ queryEvidenceAction isEqual (Ord.cmp (SignsForEvidence.fromIdentity evidence) externalIdentity) || isEqual (Ord.cmp (SignsForEvidence.toIdentity evidence) externalIdentity) } (SignsForLocalState.evidenceStore localState); - responseMsg := mkReplyQuerySignsForEvidence@{ + responseMsg := Anoma.MsgSignsFor (MsgQuerySignsForEvidenceReply mkReplyQuerySignsForEvidence@{ externalIdentity := externalIdentity; evidence := relevantEvidence; err := none - }; - in some mkActionEffect@{ - env := env; - msgs := [mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := msgSender; - mailbox := some 0; - msg := Anoma.MsgSignsFor (MsgQuerySignsForEvidenceReply responseMsg) - }]; - timers := []; - engines := [] - } + }); + in some (defaultReplyActionEffect env cfg msgSender responseMsg) | _ := none } ``` diff --git a/docs/arch/node/engines/ticker_behaviour.juvix.md b/docs/arch/node/engines/ticker_behaviour.juvix.md index 45abc57ffd9..fb5491da126 100644 --- a/docs/arch/node/engines/ticker_behaviour.juvix.md +++ b/docs/arch/node/engines/ticker_behaviour.juvix.md @@ -20,6 +20,7 @@ tags: import arch.node.engines.ticker_environment open; import prelude open; + import arch.node.utils open; import arch.node.types.basics open; import arch.node.types.identities open; import arch.node.types.messages open; @@ -200,24 +201,10 @@ countReplyAction in case getEngineMsgFromTimestampedTrigger trigger of { | some emsg := - some mkActionEffect@{ - env := env; - msgs := [ - mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := - Anoma.MsgTicker - (TickerMsgCountReply - mkCountReply@{ - counter := counterValue; - }) - } - ]; - timers := []; - engines := []; - } + let responseMsg := Anoma.MsgTicker (TickerMsgCountReply mkCountReply@{ + counter := counterValue; + }) + in some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) responseMsg) | _ := none }; ``` diff --git a/docs/arch/node/engines/verification_behaviour.juvix.md b/docs/arch/node/engines/verification_behaviour.juvix.md index 8f3094d6d7c..318bcd4b26b 100644 --- a/docs/arch/node/engines/verification_behaviour.juvix.md +++ b/docs/arch/node/engines/verification_behaviour.juvix.md @@ -18,6 +18,7 @@ tags: import prelude open; import arch.node.types.messages open; import arch.system.identity.identity open hiding {ExternalIdentity}; + import arch.node.utils open; import arch.node.types.engine open; import arch.node.engines.verification_config open; import arch.node.engines.verification_environment open; @@ -344,24 +345,13 @@ verifyAction | mkEngineMsg@{msg := Anoma.MsgVerification (MsgVerificationRequest (mkRequestVerification data commitment externalIdentity useSignsFor))} := case useSignsFor of { | false := - some mkActionEffect@{ - env := env; - msgs := [ - mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := Anoma.MsgVerification (MsgVerificationReply (mkReplyVerification - (Verifier.verify - (VerificationCfg.verifier (EngineCfg.cfg cfg) Set.empty externalIdentity) - (VerificationCfg.backend (EngineCfg.cfg cfg)) - data commitment) - none)) - } - ]; - timers := []; - engines := [] - } + let responseMsg := Anoma.MsgVerification (MsgVerificationReply (mkReplyVerification + (Verifier.verify + (VerificationCfg.verifier (EngineCfg.cfg cfg) Set.empty externalIdentity) + (VerificationCfg.backend (EngineCfg.cfg cfg)) + data commitment) + none)) + in some (defaultReplyActionEffect env cfg (EngineMsg.sender emsg) responseMsg) | true := let existingRequests := Map.lookup externalIdentity (VerificationLocalState.pendingRequests localState); @@ -375,23 +365,9 @@ verifyAction }; newEnv := env@EngineEnv{ localState := newLocalState - } - in some mkActionEffect@{ - env := newEnv; - msgs := case existingRequests of { - | some _ := [] - | none := [ - mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := VerificationCfg.signsForEngineAddress (EngineCfg.cfg cfg); - mailbox := some 0; - msg := Anoma.MsgSignsFor (MsgQuerySignsForEvidenceRequest (mkRequestQuerySignsForEvidence externalIdentity)) - } - ] }; - timers := []; - engines := [] - } + responseMsg := Anoma.MsgSignsFor (MsgQuerySignsForEvidenceRequest (mkRequestQuerySignsForEvidence externalIdentity)) + in some (defaultReplyActionEffect env cfg (VerificationCfg.signsForEngineAddress (EngineCfg.cfg cfg)) responseMsg) } | _ := none } @@ -444,18 +420,14 @@ signsForReplyAction let whoAsked := fst req; data := fst (snd req); - commitment := snd (snd req) - in mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := whoAsked; - mailbox := some 0; - msg := Anoma.MsgVerification (MsgVerificationReply (mkReplyVerification + commitment := snd (snd req); + responseMsg := Anoma.MsgVerification (MsgVerificationReply (mkReplyVerification (Verifier.verify (VerificationCfg.verifier (EngineCfg.cfg cfg) evidence externalIdentity) (VerificationCfg.backend (EngineCfg.cfg cfg)) data commitment) none)) - }}) reqs; + in defaultReplyMsg cfg whoAsked responseMsg}) reqs; timers := []; engines := [] } diff --git a/docs/arch/node/engines/wall_clock_behaviour.juvix.md b/docs/arch/node/engines/wall_clock_behaviour.juvix.md index 507d9dd8fab..ce64b08542a 100644 --- a/docs/arch/node/engines/wall_clock_behaviour.juvix.md +++ b/docs/arch/node/engines/wall_clock_behaviour.juvix.md @@ -20,6 +20,7 @@ tags: import arch.node.engines.wall_clock_environment open; import prelude open; + import arch.node.utils open; import arch.node.types.basics open; import arch.node.types.identities open; import arch.node.types.messages open; @@ -172,28 +173,15 @@ getTimeAction in case getEngineMsgFromTimestampedTrigger trigger of { | some emsg := - some mkActionEffect@{ - env := env@EngineEnv{ - localState := mkWallClockLocalState@{ - currentTime := newTime - } - }; - msgs := [ - mkEngineMsg@{ - sender := getEngineIDFromEngineCfg cfg; - target := EngineMsg.sender emsg; - mailbox := some 0; - msg := - Anoma.MsgWallClock - (WallClockGetTimeResult - mkTimeResult@{ - epochTime := newTime - }) - } - ]; - timers := []; - engines := []; - } + let newEnv := env@EngineEnv{ + localState := mkWallClockLocalState@{ + currentTime := newTime + } + }; + responseMsg := Anoma.MsgWallClock (WallClockGetTimeResult mkTimeResult@{ + epochTime := newTime + }) + in some (defaultReplyActionEffect newEnv cfg (EngineMsg.sender emsg) responseMsg) | _ := none }; ``` diff --git a/docs/arch/node/utils.juvix.md b/docs/arch/node/utils.juvix.md new file mode 100644 index 00000000000..c6e224d14a4 --- /dev/null +++ b/docs/arch/node/utils.juvix.md @@ -0,0 +1,109 @@ +--- +icon: material/tools +search: + exclude: false +tags: + - node-architecture + - utils + - engine +--- + +??? code "Juvix imports" + + ```juvix + module arch.node.utils; + + import prelude 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; + ``` + +# Utility Functions for Engine Behavior + +This module provides generic utility functions to simplify common patterns in engine behaviors, +particularly for creating message responses and action effects. These utilities are designed to +work with any engine type without requiring engine-specific customization. + +## Message Construction Utilities + +### `createReplyMsg` + +Creates a standard engine message reply based on the incoming message, with a specified reply message content. + + +```juvix +defaultReplyMsg + {M C} + (cfg : EngineCfg C) + (target : EngineID) + (replyMsg : M) + : EngineMsg M := + mkEngineMsg@{ + sender := getEngineIDFromEngineCfg cfg; + target := target; + mailbox := some 0; + msg := replyMsg + }; +``` + + +## Action Effect Utilities + +### `msgActionEffect` + +Creates an action effect specifically for Anoma message types, handling the conversion between specific configuration types and the PreCfg type. + + +```juvix +msgActionEffect + {S B H} + (env : EngineEnv S B H Anoma.Msg) + (msgs : List (EngineMsg Anoma.Msg)) + : ActionEffect S B H Anoma.Msg Anoma.Cfg Anoma.Env := + mkActionEffect@{ + env := env; + msgs := msgs; + timers := []; + engines := [] + }; +``` + + +### `replyActionEffect` + +Creates an action effect with a single reply message specifically for Anoma message types. + + +```juvix +replyActionEffect + {S B H C} + (env : EngineEnv S B H Anoma.Msg) + (cfg : EngineCfg C) + (target : EngineID) + (replyMsg : Anoma.Msg) + : ActionEffect S B H Anoma.Msg Anoma.Cfg Anoma.Env := + let + msg := defaultReplyMsg cfg target replyMsg + in msgActionEffect {S} {B} {H} env [msg]; +``` + + +### `defaultReplyActionEffect` + +Creates an action effect with a single reply message using the default mailbox (ID 0) specifically for Anoma message types. + + +```juvix +defaultReplyActionEffect + {S B H C} + (env : EngineEnv S B H Anoma.Msg) + (cfg : EngineCfg C) + (target : EngineID) + (replyMsg : Anoma.Msg) + : ActionEffect S B H Anoma.Msg Anoma.Cfg Anoma.Env := + replyActionEffect {S} {B} {H} {C} env cfg target replyMsg; +``` +