Interactions
Overview
What's an Interaction?
A MOI Interaction refers to any kind of action between participants on the MOI network. It results in a state
change on the respective accounts of the interaction participants. For example, if Bob were to send Alice 1 unit of
an asset, that asset must be deducted from Bob's balance and credited to Alice; this is known as an Asset Transfer
which is facilitated through AssetAction.
Other examples of Interactions in MOI include:
- The creation of a new participant account
- The configuration of account keys
- The creation of a new Asset
- The transfer of one or more existing Assets between participants
- The minting/burning of an existing supply adjustable Asset
- The registration and staking of Guardians
- The deployment of a new Logic
- The invocation of a routine on an existing Logic
Just like Transactions in other blockchain networks, Interactions in MOI need to be broadcast to the whole
network, and all Guardian nodes in the network compete to finalize them. Any node can attempt to finalize an
Interaction by successfully locking the context of the Interaction participants, executing the Interaction and
finalizing the state transitions on the participants. Interactions require a fee for the cost incurred by the
network to validate & execute them.
Interaction vs Transaction
The primary difference between Interactions in MOI and Transactions in other blockchain protocols is the degree of
general-purpose capability and flexibility.
- An Interaction intrinsically describes unique state transitions based on its type, and thus it is very easy to optimize
consensus and design specific zk-proofs for these Interactions because the scope of the state transition is limited.
- A Transaction, on the other hand, is designed to be a general-purpose wrapper and has a very large scope of state
transition, thus limiting the ability of the network to perform advanced validation and other optimisations without
relying on the operation execution layer.
- While Interactions are designed to express transitions between participants, Transactions are intended to express
transitions between network state checkpoints and hence better at expressing units of transition on a large-scale
peer-to-peer network.
- Interactions are also capable of being highly customizable with participants being able to choose the parameters
and constraints within which they are finalized, allowing for a very flexible modulation of trust.
Structure of an Interaction
| Parameter | Type | Description |
|---|
| sender | Sender | Object containing details of the interaction sender |
| payer | HEX (32 Bytes) | Unique identifier of the payer [optional] |
| fuel_price | HEX | Fuel price per unit |
| fuel_limit | HEX | Maximum fuel to consume |
| funds | Array<IxFund> | List of fund transfers attached to the interaction [optional] |
| ix_operations | Array<IxOperation> | List of one or more interaction operations (1–3 max) |
| participants | Array<Participant> | List of participants involved in the interaction, each defining locking behavior and notary status |
| preferences | IxPreferences | Defines the compute and consensus preferences for the interaction [optional] |
| perception | Bytes | Encoded representation of the perceived asset value at the time of interaction (e.g., 1 KMOI = 1 USD) [optional] |
Sender
The Sender object represents the participant initiating the interaction.
| Field | Type | Description |
|---|
| id | HEX (32 Bytes) | Unique identifier of the sender |
| sequence_id | Number | Sequential identifier used for ordering interactions |
| key_id | Number | Identifier representing the public key associated with the sender |
IxFund
The IxFund object represents a fund transfer attached to the interaction.
| Field | Type | Description |
|---|
| asset_id | HEX (32 Bytes) | Asset identifier for the fund |
| amount | HEX | Amount of the asset being transferred |
IxPreferences
The IxPreferences object defines the preferences used for interaction execution, covering compute and consensus behavior.
| Field | Type | Description |
|---|
| compute | Bytes | Encoded data representing compute preferences |
| consensus | IxConsensusPreference | Object containing consensus-specific preferences for the interaction |
IxConsensusPreference
The IxConsensusPreference object defines the consensus-related preferences for an interaction.
| Field | Type | Description |
|---|
| MTQ | uint | Modulated trust quotient required for the interaction to be considered valid |
| TrustNodes | Array\<KramaID> | List of trusted node identifiers (KramaID) that participate in consensus |
Participants and Locking
Participant
The Participant object represents a participant involved in the interaction.
| Field | Type | Description |
|---|
| id | HEX (32 Bytes) | Unique identifier representing the participant |
| lock_type | LockType | Defines the locking mechanism used for the participant's account |
| notary | Boolean | Indicates whether the participant acts as a notary in the interaction |
The sender of an interaction is implicitly included as a participant. Additional participants are determined by the
interaction type — for example, an AssetAction transfer requires the beneficiary as a participant, and a LogicInvoke
requires the logic account as a participant.
LockType
Specifies the type of lock applied to a participant's account during interaction execution.
| Value | Name | Description |
|---|
| 0 | MutateLock | Allows modification of the participant's account state |
| 1 | ReadLock | Grants read-only access to the participant's account |
| 2 | NoLock | No locking mechanism; the participant's account remains unaffected |
Interaction Types
Each ix_operation within an interaction carries a type field that identifies the kind of interaction being performed,
along with a type-specific payload.
ParticipantCreate
Registers a new participant within the network, establishing their unique identity.
It serves as the entry point to interact with the network.
ParticipantCreateOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (1 for ParticipantCreate) |
| payload | ParticipantCreatePayload | Contains the information about the participant to be registered |
ParticipantCreatePayload
| Parameter | Type | Description |
|---|
| id | HEX (32 Bytes) | Id of the participant to be registered |
| add | Array<KeyAddPayload> | List of new keys to be added to the account |
| value | AssetActionPayload | Optional payload defining contextual parameters or initialization actions |
{
"payload": {
"id": "0x000000004678e9f5bf2f66362ef5367fbc72efe7b419a5e7d851f57b00000000",
"keys_payload": [
{
"public_key": "0x00000000513b40a069905a1b05bd28d8338ad4a2eff419d7972be75900000000",
"weight": 1000,
"signature_algorithm": 0
}
],
"value": {
"asset_id": "0x108000004cd973c4eb83cdb8870c0de209736270491b7acc99873da100000000",
"callsite": "Transfer",
"calldata": "0x0d6f06659601c502616d6f756e7403138862656e65666963696172790600000000513b40a069905a1b05bd28d8338ad4a2eff419d7972be75900000000"
}
}
}
{
"sender": {
"id": "0x000000001ec28dabfc3e4ac4dfc2084b45785b5e9cf1287b63a4f46900000000",
"sequence": 0,
"key_id": 0
},
"fuel_price": 1,
"fuel_limit": 10000,
"ix_operations": [
{
"type": 1,
"payload": {
"id": "0x000000004678e9f5bf2f66362ef5367fbc72efe7b419a5e7d851f57b00000000",
"keys_payload": [
{
"public_key": "0x00000000513b40a069905a1b05bd28d8338ad4a2eff419d7972be75900000000",
"weight": 1000,
"signature_algorithm": 0
}
],
"value": {
"asset_id": "0x108000004cd973c4eb83cdb8870c0de209736270491b7acc99873da100000000",
"callsite": "Transfer",
"calldata": "0x0d6f06659601c502616d6f756e7403138862656e65666963696172790600000000513b40a069905a1b05bd28d8338ad4a2eff419d7972be75900000000"
}
}
}
],
"participants": [
{
"id": "0x108000004cd973c4eb83cdb8870c0de209736270491b7acc99873da100000000",
"lock_type": 2
}
]
}
ParticipantCreate does not return any result in the data field. A successful
participant creation is indicated when the operation's status in the receipt
is marked as successful.
Manages an account's configuration by enabling the addition or revocation of associated cryptographic keys.
It ensures that account control and permissions remain flexible and securely maintained over time.
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (2 for AccountConfigure) |
| payload | AccountConfigurePayload | Contains the key management details for account configuration |
KeyAddPayload
| Parameter | Type | Description |
|---|
| public_key | BYTES | Public key of the account key to be added |
| weight | NUMBER | The weight assigned to the key for multi-signature operations |
| signature_algorithm | NUMBER | The signature algorithm type used by the key |
KeyRevokePayload
| Parameter | Type | Description |
|---|
| key_id | NUMBER | The unique identifier of the key to revoke |
{
"payload": {
"add": [
{
"public_key": "0x000000004678e9f5bf2f66362ef5367fbc72efe7b419a5e7d851f57b00000000",
"weight": 1000,
"signature_algorithm": 0
}
],
"revoke": []
}
}
{
"sender": {
"id": "0x000000001ec28dabfc3e4ac4dfc2084b45785b5e9cf1287b63a4f46900000000",
"sequence": 1,
"key_id": 0
},
"fuel_price": 1,
"fuel_limit": 10000,
"ix_operations": [
{
"type": 2,
"payload": {
"add": [
{
"public_key": "0x000000004678e9f5bf2f66362ef5367fbc72efe7b419a5e7d851f57b00000000",
"weight": 1000,
"signature_algorithm": 0
}
],
"revoke": []
}
}
],
"participants": []
}
AccountConfigure does not return any result in the data field. A successful
account configuration is indicated when the operation's status in the receipt
is marked as successful.
AccountInherit
Allows an account to inherit the context or configuration of a specified target account.
It is primarily used to instantiate sub-accounts that operate under shared governance or predefined parameters.
AccountInheritOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (3 for AccountInherit) |
| payload | AccountInheritPayload | Contains information about the inheritance process |
AccountInheritPayload
| Parameter | Type | Description |
|---|
| target_account | HEX (32 Bytes) | The account identifier whose context or configuration will be inherited |
| value | AssetActionPayload | Optional payload defining contextual parameters or initialization actions |
| sub_account_index | NUMBER | The index of the sub-account inheriting from the target account |
{
"payload": {
"target_account": "0x3b7f1d9b847f8a1f2d2f48701b56e0b6ff6727e7e56a3155db9e1f2b3fbb4d33",
"value": {
"asset_id": "0x108000004cd973c4eb83cdb8870c0de209736270491b7acc99873da100000000",
"callsite": "Transfer",
"calldata": "0x0d6f06659601c502616d6f756e7403138862656e65666963696172790600000000513b40a069905a1b05bd28d8338ad4a2eff419d7972be75900000000"
},
"sub_account_index": 0
}
}
{
"sender": {
"id": "0x000000001ec28dabfc3e4ac4dfc2084b45785b5e9cf1287b63a4f46900000000",
"sequence": 2,
"key_id": 0
},
"fuel_price": 1,
"fuel_limit": 10000,
"ix_operations": [
{
"type": 3,
"payload": {
"target_account": "0x20800000a6ba9853f131679d00da0f033516a2efe9cd53c3d54e1f9a00000000",
"value": {
"asset_id": "0x108000004cd973c4eb83cdb8870c0de209736270491b7acc99873da100000000",
"callsite": "Transfer",
"calldata": "0x0d6f06659601c502616d6f756e7403138862656e65666963696172790600000000513b40a069905a1b05bd28d8338ad4a2eff419d7972be75900000000"
},
"sub_account_index": 0
}
}
],
"participants": [
{
"id": "0x108000004cd973c4eb83cdb8870c0de209736270491b7acc99873da100000000",
"lock_type": 2
}
]
}
AccountInherit does not return any result in the data field. A successful
account inheritance is indicated when the operation's status in the receipt
is marked as successful.
AssetCreate
Defines and registers a new asset within the Tesseract Lattice.
It establishes the foundational metadata, ownership structure, and initial state of the asset.
AssetCreateOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (4 for AssetCreate) |
| payload | AssetCreatePayload | Contains the information about the asset to be created |
AssetCreatePayload
| Parameter | Type | Description |
|---|
| symbol | STRING | Symbol of the asset (e.g., KOI) |
| max_supply | NUMBER | Maximum supply of the asset (e.g., 20000) |
| standard | NUMBER | Standard of the asset (e.g., 0) |
| dimension | NUMBER | Dimension or type classification of the asset (e.g., 0) |
| enable_events | BOOLEAN | Whether events are enabled for the asset |
| manager | STRING | Participant id of the asset manager |
AssetCreateResult
| Parameter | Type | Description |
|---|
| asset_id | HEX (32 Bytes) | Asset ID of created asset |
| id | HEX (32 Bytes) | Account id of asset |
{
"payload": {
"symbol": "KOI",
"max_supply": 20000,
"standard": 0,
"dimension": 0,
"enable_events": true,
"manager": "0x000000001ec28dabfc3e4ac4dfc2084b45785b5e9cf1287b63a4f46900000000"
}
}
{
"sender": {
"id": "0x000000001ec28dabfc3e4ac4dfc2084b45785b5e9cf1287b63a4f46900000000",
"sequence": 4,
"key_id": 0
},
"fuel_price": 1,
"fuel_limit": 10000,
"ix_operations": [
{
"type": 4,
"payload": {
"symbol": "KOI",
"max_supply": 20000,
"standard": 0,
"dimension": 0,
"enable_events": true,
"manager": "0x000000001ec28dabfc3e4ac4dfc2084b45785b5e9cf1287b63a4f46900000000"
}
}
],
"participants": []
}
{
"asset_id": "0x10030000d9f12d13c0347a737430cdbcca174164f0823ccc39bedbe800000000",
"error": "0x"
}
AssetAction
Executes asset-specific routines. It encompasses a wide range of programmable asset behaviors,
including transfers, minting, burning, approvals, locking, and other custom interactions defined within the asset logic.
AssetActionOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (5 for AssetAction) |
| payload | AssetActionPayload | Contains the information about the asset action to execute |
AssetActionPayload
| Parameter | Type | Description |
|---|
| asset_id | HEX (32 Bytes) | The asset or context reference identifier |
| callsite | STRING | The function or entry point to invoke on the asset |
| calldata | HEX | Encoded call data representing contextual parameters |
| interfaces | map[HEX]HEX (32 Bytes) | The external logic interfaces required for this interaction |
{
"payload": {
"asset_id": "0x10030000d9f12d13c0347a737430cdbcca174164f0823ccc39bedbe800000000",
"callsite": "Transfer",
"calldata": "0x0d6f06659601c502616d6f756e7403138862656e65666963696172790600000000ed434a2ab138e69295e134686d57d80a9aa3325dbbde9bbf00000000"
}
}
{
"sender": {
"id": "0x000000001ec28dabfc3e4ac4dfc2084b45785b5e9cf1287b63a4f46900000000",
"sequence": 7,
"key_id": 0
},
"fuel_price": 1,
"fuel_limit": 10000,
"ix_operations": [
{
"type": 5,
"payload": {
"asset_id": "0x10030000d9f12d13c0347a737430cdbcca174164f0823ccc39bedbe800000000",
"callsite": "Transfer",
"calldata": "0x0d6f06659601c502616d6f756e7403138862656e65666963696172790600000000ed434a2ab138e69295e134686d57d80a9aa3325dbbde9bbf00000000"
}
}
],
"participants": [
{
"id": "0x00000000ed434a2ab138e69295e134686d57d80a9aa3325dbbde9bbf00000000",
"lock_type": 0
},
{
"id": "0x10030000d9f12d13c0347a737430cdbcca174164f0823ccc39bedbe800000000",
"lock_type": 2
}
]
}
{
"outputs": "0x0d0f",
"error": "0x"
}
GuardianRegister
Registers a new Guardian node on the MOI network, allowing it to participate in consensus and interaction finalization.
GuardianRegisterOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (6 for GuardianRegister) |
| payload | GuardianRegisterPayload | Contains the registration details for the Guardian |
GuardianRegisterPayload
| Parameter | Type | Description |
|---|
| krama_id | KramaID | Unique identifier for the Guardian node |
| wallet_id | HEX (32 Bytes) | Wallet identifier associated with the Guardian |
| consensus_key | BYTES | Consensus public key for the Guardian |
| kyc_proof | BYTES | KYC proof for Guardian verification |
| amount | HEX | Amount to stake during registration |
Guardian-specific examples will be provided in a future update.
GuardianStake
Adds additional stake to an already registered Guardian node.
GuardianStakeOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (7 for GuardianStake) |
| payload | GuardianActionPayload | Contains the staking details |
GuardianUnstake
Initiates the unstaking process for a Guardian node, beginning the withdrawal period.
GuardianUnstakeOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (8 for GuardianUnstake) |
| payload | GuardianActionPayload | Contains the unstaking details |
GuardianWithdraw
Withdraws previously unstaked funds after the withdrawal period has elapsed.
GuardianWithdrawOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (9 for GuardianWithdraw) |
| payload | GuardianActionPayload | Contains the withdrawal details |
GuardianClaim
Claims Guardian rewards accrued through network participation.
GuardianClaimOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (10 for GuardianClaim) |
| payload | GuardianActionPayload | Contains the claim details |
GuardianActionPayload
Shared payload structure for GuardianStake, GuardianUnstake, GuardianWithdraw, and GuardianClaim.
| Parameter | Type | Description |
|---|
| krama_id | KramaID | Unique identifier for the Guardian node |
| amount | HEX | Amount relevant to the action |
LogicDeploy
Deploys a new logic instance to the network for decentralized execution.
It enables the registration of custom routines or smart modules that can be invoked by participants.
LogicDeployOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (11 for LogicDeploy) |
| payload | LogicDeployPayload | Contains the information about the logic to be deployed |
LogicDeployPayload
| Parameter | Type | Description |
|---|
| manifest | HEX | Serialized manifest |
| callsite | STRING | Routine to be executed |
| calldata | HEX | Serialized input for logic deploy |
LogicDeployResult
| Parameter | Type | Description |
|---|
| logic_id | HEX (32 Bytes) | Logic ID of deployed Logic |
| error | HEX | Serialised error data if deployer execution fails |
{
"payload": {
"manifest": "0x0e6f031ef601ce02...",
"logic_id": "0x0000000000000000000000000000000000000000000000000000000000000000",
"callsite": "Seed",
"calldata": "0x0d2f0675696e697469616c02"
}
}
{
"sender": {
"id": "0x000000001ec28dabfc3e4ac4dfc2084b45785b5e9cf1287b63a4f46900000000",
"sequence": 8,
"key_id": 0
},
"fuel_price": 1,
"fuel_limit": 10000,
"ix_operations": [
{
"type": 11,
"payload": {
"manifest": "0x0e6f031ef601ce02...",
"callsite": "Seeder",
"calldata": "0x0def0106458601e501f605d506a60785..."
}
}
],
"participants": []
}
{
"logic_id": "0x20000000ff572431a4f52ad972f54fee061847c682eb22ffa51c97a900000000",
"error": "0x"
}
LogicInvoke
Triggers the execution of a predefined routine within a deployed logic instance.
It allows participants to invoke specific routines within the deployed logic modules on the network.
LogicInvokeOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (12 for LogicInvoke) |
| payload | LogicInvokePayload | Contains the information about the specific routine to invoke |
LogicInvokePayload
| Parameter | Type | Description |
|---|
| logic_id | HEX (32 Bytes) | The unique identifier of the logic that needs to be invoked |
| callsite | STRING | Routine to be executed |
| calldata | HEX | Serialised input for logic execution |
LogicInvokeResult
| Parameter | Type | Description |
|---|
| outputs | HEX | Serialised output of logic execution |
| error | HEX | Serialised error data if logic execution failed |
{
"payload": {
"logic_id": "0x0800008d898ef91ebd8a208855d6d1c98939202cfcb6a067530845993fe6975de1eb84",
"callsite": "BalanceOf",
"calldata": "0x0d2f0645616464720652fdfc072182654f163f5f0f9a621d729566c74d10037c4d7bbb0407d1e2c649"
}
}
{
"sender": {
"id": "0x000000001ec28dabfc3e4ac4dfc2084b45785b5e9cf1287b63a4f46900000000",
"sequence": 9,
"key_id": 0
},
"fuel_price": 1,
"fuel_limit": 10000,
"ix_operations": [
{
"type": 12,
"payload": {
"logic_id": "0x0800008d898ef91ebd8a208855d6d1c98939202cfcb6a067530845993fe6975de1eb84",
"callsite": "BalanceOf",
"calldata": "0x0d2f0645616464720652fdfc072182654f163f5f0f9a621d729566c74d10037c4d7bbb0407d1e2c649"
}
}
],
"participants": [
{
"id": "0x0800008d898ef91ebd8a208855d6d1c98939202cfcb6a067530845993fe6975de1eb84",
"lock_type": 1
}
]
}
{
"outputs": "0x0d2f0667616d6f756e740301312d00",
"error": "0x"
}
LogicEnlist
Enlists a logic instance for extended network participation. This enables logic modules to be
discovered and interacted with across broader network contexts.
LogicEnlistOperation
| Parameter | Type | Description |
|---|
| type | NUMBER | Type of interaction (13 for LogicEnlist) |
| payload | LogicEnlistPayload | Contains the information about the logic to be enlisted |
LogicEnlistPayload
| Parameter | Type | Description |
|---|
| logic_id | HEX (32 Bytes) | The unique identifier of the logic to be enlisted |
| callsite | STRING | Routine to be executed |
| calldata | HEX | Serialised input for enlistment |
Future Interaction Types
The following interaction types are defined but not yet active:
- LogicInteract (14) — Reserved for cross-logic interaction capabilities.
- LogicUpgrade (15) — Reserved for upgrading deployed logic instances.
Additional interaction types for native fuel management, governance, and voting are planned for future rollouts.
Execution Fuel
The fuel parameters fuel_price and fuel_limit in the Interaction determine the fuel dynamics and cost of that
Interaction. Fuel is paid for with the KMOI asset.
- Price adjustment of an Interaction is not supported for the Public Devnet, i.e., the
fuel_price of an
Interaction must always be 0x1 [1 fuel unit = 1 KMOI]. Any other value for this field will result in
the Interaction being rejected by the network. - The account of the Interaction
sender must have sufficient balance of KMOI for the specified fuel_limit
of an Interaction. The total cost is calculated as: FuelPrice × FuelLimit + KMOITokenValue. - The
fuel_limit value must be large enough for the cost of the Interaction execution (based on
the Interaction type). For LogicInvoke, additional fuel will be charged based on code execution of the Logic.
Base Fuel Costs
| Interaction Type | Base Fuel |
|---|
| ParticipantCreate | 100 |
| AccountConfigure | 100 |
| AccountInherit | 100 |
| AssetCreate | 100 |
| AssetAction (Transfer) | 100 |
| AssetAction (Mint) | 100 |
| AssetAction (Burn) | 100 |
| AssetAction (Approve) | 100 |
| AssetAction (Revoke) | 100 |
| AssetAction (Release) | 100 |
| AssetAction (Lockup) | 100 |
| GuardianRegister | 100 |
| GuardianStake | 100 |
| GuardianUnstake | 100 |
| GuardianWithdraw | 100 |
| GuardianClaim | 100 |
| LogicDeploy | 100 |
For more information about Execution Fuel and KMOI in MOI, refer to Execution Fuel.
Interaction Lifecycle
Once an Interaction has been submitted to the network, the following happens:
- An interaction hash is cryptographically generated:
0x43d99bc7729218611a21b12c933c949d4f31684f1d6954ff417d0477538ff032 - The interaction is broadcast to the entire network and is added to the interaction pool consisting of
other pending network interactions.
- Guardians will then attempt to finalize this Interaction (and other Interactions with the same context lock) by
forming an ICS (Interaction Consensus Set) Cluster around it. The formation of this cluster indicates the
successful locking on the context states of the interaction participants.
- Once the ICS is formed, all Guardians in the cluster will execute the Interactions, verify each other's execution,
update the participant contexts and agree on the state transition for each of the interaction participants. Once
consensus is reached, the Interactions are bundled into a Tesseract for each participant and added to their respective
participant Lattices.
- Each Interaction when included in a Tesseract is bundled with an Interaction Receipt containing the proof and output of
the Interaction. This receipt can be retrieved using the interaction hash.
- After successfully transitioning the context state of the interaction participants, the updated state is propagated
to the rest of the network and the ICS cluster is dismissed.
At any point in time, millions of Interactions can be finalized in parallel across multiple ICS Clusters
around the network that are being dynamically assembled and dismissed based on the context of the Interaction
and its Participants.
Interaction Receipt
Every finalized Interaction produces a receipt that can be queried using the interaction hash via the
moi.InteractionReceipt API.
Receipt Structure
| Field | Type | Description |
|---|
| ix_hash | HEX (32 Bytes) | Hash of the interaction |
| status | ReceiptStatus | Overall execution status |
| fuel_used | HEX | Actual fuel consumed during execution |
| ix_operations | Array<IxOpResult> | Per-operation results |
| from | HEX (32 Bytes) | Sender address |
| ts_hash | HEX (32 Bytes) | Tesseract hash the interaction was included in |
| participants | Array | Post-execution participant states |
Receipt Status Codes
| Value | Name | Description |
|---|
| 0 | ReceiptOk | Interaction executed successfully |
| 1 | ReceiptStateReverted | Execution caused a state revert |
| 2 | ReceiptInsufficientFuel | Interaction ran out of fuel during execution |
Interaction Type Result
Each interaction type within an interaction produces an individual result.
| Field | Type | Description |
|---|
| ix_type | NUMBER | The interaction type that produced this result |
| status | IxOpStatus | Execution status for this specific operation |
| data | JSON | Type-specific result data (see each interaction type) |
| logs | Array | Logs emitted during execution |
Interaction Type Result Status Codes
| Value | Name | Description |
|---|
| 0 | ResultOk | Operation executed successfully |
| 1 | ResultExceptionRaised | An exception was raised during execution |
| 2 | ResultDefectRaised | A defect was raised during execution |
Validation Constraints
Interactions must satisfy the following constraints to be accepted by the network:
| Constraint | Value |
|---|
| Maximum operations per interaction | 3 |
| Maximum AssetCreate per interaction | 1 |
| Maximum LogicDeploy per interaction | 1 |
| Maximum interaction size | 128 KB |
| Minimum key weight (ParticipantCreate) | 1000 |
| Fuel price (Public Devnet) | Must be 1 |
| Sender | Must not be nil; must not be the genesis account |
| Sequence ID | Must be >= the next expected sequence for the sender |
| Sender balance | Must have sufficient KMOI to cover total cost |
| Participants | All non-genesis participants must be registered on the network |
| Signatures | Must be valid for the sender's registered keys |
Packages & SDKs
- JS MOI SDK — JavaScript/TypeScript library to interact with the MOI Protocol: submit interactions, deploy and invoke logics, and manage participants and assets.
- JS POLO — JavaScript/TypeScript implementation of the POLO serialization scheme used by MOI.
- GO POLO — Go implementation of the POLO serialization scheme.
- Cocolang — Language and toolchain for writing Coco modules (logics), compiling them, and testing with CocoLab.