syntax = "proto3";

package quilibrium.node.application.pb;

option go_package = "source.quilibrium.com/quilibrium/monorepo/node/protobufs";

message Application {
  bytes address = 1;
  ExecutionContext execution_context = 2;
}

// The ExecutionContext defines the operating environment of the application
enum ExecutionContext {
  // Intrinsic execution is a protocol-native application – Nodes are expected
  // to have the necessary information required to execute.
  // Intrinsic applications have addresses that have infinitessimal likelihood
  // of collision and must be constructed as nothing-up-my-sleeve values.
  EXECUTION_CONTEXT_INTRINSIC = 0;
  // Hypergraph execution is also protocol-native, however it can be chained
  // with extrinsic execution whereas other intrinsics cannot.
  // Hypergraph applications have addresses that are derived from location
  // within the hypergraph.
  EXECUTION_CONTEXT_HYPERGRAPH = 1;
  // Extrinsic execution is evaluation of application code that lives on the
  // protocol, either within the hypergraph or supplementary to it, e.g. MetaVM.
  EXECUTION_CONTEXT_EXTRINSIC = 2;
}

message IntrinsicExecutionInput {
  bytes address = 1;
  bytes input = 2;
}

message IntrinsicExecutionOutput {
  bytes address = 1;
  bytes output = 2;
  bytes proof = 3;
}

message Message {
  bytes hash = 1;
  bytes address = 2;
  bytes payload = 3;
}