Skip to main content
Version: axone-gov-v1.0.0

AXONE Governance Contract (axone-gov)

The AXONE Governance contract attaches governance capabilities to a resource represented by an Abstract Account (AA).

In the AXONE protocol, resources are first-class citizens. Instantiating this contract on a resource AA equips that resource with an explicit, programmable governance layer.

Core Concepts​

Resource & Abstract Account​

In AXONE, every resource is represented by an Abstract Account (AA). The AA acts as the canonical on-chain identity and execution context for the resource.

The axone-gov contract is deployed on top of an AA. Doing so does not create governance in isolation: it binds governance to the resource itself.

Constitution​

A constitution is a Prolog program stored by the contract. It defines the governance rules of the resource.

Concretely, the constitution:

  • Encodes governance rules as Prolog predicates
  • May query on-chain facts via the AXONE logic module
  • Is the single source of truth for all governance decisions

The constitution exposes the following entrypoints:

  • governance:decide/2
  • governance:decide/3

These predicates are validated at contract instantiation.

Case​

A Case represents the context submitted for a governance decision.

It is expressed as a Prolog dictionary, conventionally written as ctx{...}. A case may include any contextual elements required by the constitution, such as:

  • intents
  • actors
  • subjects
  • external facts or signals

On-chain facts (e.g. verifiable credentials, resource state) are not passed through the case. They are queried directly by the constitution itself.

Governance Decisions​

The core governance operation is the evaluation of a case through the constitution.

Depending on the query mode, the constitution returns:

  • a verdict (decide/2)
  • or a verdict with motivation (decide/3)

Both the verdict and the motivation are arbitrary Prolog terms. The contract does not constrain their structure.

Constitutional Revision​

The constitution is not static. It can be revised through a governance-controlled process.

A constitutional revision is performed by submitting an execution message that:

  1. Proposes a new constitution
  2. Evaluates the current constitution on a case containing the intent gov:revise_constitution

The revision is applied only if the verdict returned by the constitution is exactly:

gov:permitted

Any other verdict (atom or compound term) results in a refusal.

InstantiateMsg​

Instantiate message.

In Axone, a resource is represented by an Abstract Account (AA). Instantiating this gov app on the resource AA attaches a governance capability to that resource.

A constitution (or governance constitution) is the Prolog program stored by this contract. It expresses the resource governance as rules that decide cases and may query on-chain facts via the Axone logic module.

The constitution payload MUST be a UTF-8 encoded Prolog program.

On instantiation, the contract performs a constitutive decision by asking the constitution to decide the intent gov:establish using a contract-enriched case (including gov:module metadata and the cw:tx runtime context). The app is instantiated only if the verdict is exactly the atom gov:permitted.

Precondition: the constitution payload MUST be a UTF-8 encoded Prolog program.

The contract validates that the program can be evaluated and that it defines the required entrypoints:

  • decide/2 as governance:decide(+Case, -Verdict)

  • decide/3 as governance:decide(+Case, -Verdict, -Motivation)

Where:

  • Case is a Prolog dict term (typically ctx{...}) representing the decision context. It can include any key-value facts required by the constitution (e.g. intent, actor, subject).

  • Verdict is an arbitrary Prolog term (atom or compound) representing the decision outcome.

  • Motivation is an arbitrary Prolog term intended to justify the verdict (e.g. applicable articles, findings, interpretation rules).

The case structure used for gov:establish follows the same conventions as other governance acts (see ReviseConstitution), including gov:module metadata and the cw:tx runtime context.

variantdescription
InstantiateMsgobject. Instantiate message.

In Axone, a resource is represented by an Abstract Account (AA). Instantiating this gov app on the resource AA attaches a governance capability to that resource.

A constitution (or governance constitution) is the Prolog program stored by this contract. It expresses the resource governance as rules that decide cases and may query on-chain facts via the Axone logic module.

The constitution payload MUST be a UTF-8 encoded Prolog program.

On instantiation, the contract performs a constitutive decision by asking the constitution to decide the intent gov:establish using a contract-enriched case (including gov:module metadata and the cw:tx runtime context). The app is instantiated only if the verdict is exactly the atom gov:permitted.

Precondition: the constitution payload MUST be a UTF-8 encoded Prolog program.

The contract validates that the program can be evaluated and that it defines the required entrypoints:

- decide/2 as governance:decide(+Case, -Verdict)

- decide/3 as governance:decide(+Case, -Verdict, -Motivation)

Where:

- Case is a Prolog dict term (typically ctx{...}) representing the decision context. It can include any key-value facts required by the constitution (e.g. intent, actor, subject).

- Verdict is an arbitrary Prolog term (atom or compound) representing the decision outcome.

- Motivation is an arbitrary Prolog term intended to justify the verdict (e.g. applicable articles, findings, interpretation rules).

The case structure used for gov:establish follows the same conventions as other governance acts (see ReviseConstitution), including gov:module metadata and the cw:tx runtime context.

ExecuteMsg​

Execute messages.

ExecuteMsg::record_decision​

Record a decision on-chain by deciding a case using the stored constitution.

The case parameter is a Prolog dict term string (typically ctx{...}) representing the decision context provided by the caller.

Before evaluation, the contract enriches the case with contract-derived facts:

prolog ctx{ 'gov:module': module{ id: <atom>, version: <atom> }, 'cw:tx': tx{ message: msg{ sender: <atom>, % Bech32 address of message sender funds: [coin(Amount, Denom), ...] % List of coins sent with message }, block: block{ height: <integer>, % Block height time_seconds: <integer>, % Block timestamp (seconds since epoch) tx_index: <integer> % Transaction index (optional) } }, <caller_provided_keys>: <caller_provided_values> }

Injected keys are authoritative and overwrite any caller-provided value under the same keys.

The contract evaluates governance:decide/2 or governance:decide/3 depending on motivated, and records the resulting verdict (and optional motivation) as a durable decision record.

parameterdescription
record_decision_(Required.) _ object.
record_decision.case_(Required.) _ string. The decision context.
record_decision.motivatedboolean|null. Whether to request a motivated decision (defaults to false).

- If false, the contract calls governance:decide/2 and records only the verdict. - If true, the contract calls governance:decide/3 and records both verdict and motivation.

ExecuteMsg::revise_constitution​

Propose a constitutional revision (constitutional amendment).

The revision is a two-step governance act:

  1. The contract asks the current constitution to decide whether the revision is allowed by evaluating a case that includes the intent gov:revise_constitution.

  2. The contract then asks the proposed constitution to decide the constitutive intent gov:establish, using the same contract-enriched case (including cw:tx funds).

The complete case structure is (keys containing : are quoted atoms):

prolog ctx{ intent: <intent_atom>, % 'gov:revise_constitution' or 'gov:establish' 'gov:proposed_constitution_sha256': <hex_atom>, 'gov:current_constitution_sha256': <hex_atom>, 'gov:current_constitution_revision': <integer>, 'gov:module': module{ id: <atom>, % Contract module ID (e.g., 'axone:axone-gov') version: <atom> % Contract version (e.g., '1.2.3') }, 'cw:tx': tx{ message: msg{ sender: <atom>, % Bech32 address of message sender funds: [coin(Amount, Denom), ...] % List of coins sent with message }, block: block{ height: <integer>, % Block height time_seconds: <integer>, % Block timestamp (seconds since epoch) tx_index: <integer> % Transaction index } }, <caller_provided_keys>: <caller_provided_values> % Any additional keys from caller's case }

The revision is applied only if both decisions return the verdict gov:permitted.

parameterdescription
revise_constitution_(Required.) _ object.
revise_constitution.casestring|null. Optional additional decision context provided by the caller.

This is a Prolog dict term string (typically ctx{...}) merged into the case used to evaluate the gov:revise_constitution intent.
revise_constitution.constitution_(Required.) _ Binary. The proposed new constitution (UTF-8 Prolog program bytes).

QueryMsg​

Query messages.

QueryMsg::constitution​

Return the currently stored constitution (raw Prolog program bytes).

parameterdescription
constitution_(Required.) _ object.

QueryMsg::constitution_status​

Return the current constitution metadata (revision and hash).

parameterdescription
constitution_status_(Required.) _ object.

QueryMsg::decide​

Decide a case using the stored constitution.

The case parameter is a Prolog dict term string (typically ctx{...}) representing the decision context. This is passed as the Case argument to governance:decide/2 or governance:decide/3.

Example:

ctx{intent:read, user:"did:example:123", object:"obj:42"}

The returned verdict is an arbitrary Prolog term (atom or compound), for example:

  • gov:permitted

  • gov:forbidden

  • pay("did:...", 1000)

The optional motivation is an arbitrary Prolog term returned by the constitution and intended to justify the verdict (e.g. grounds/articles, findings, interpretation rules).

Before evaluation, the contract enriches the case with module metadata ('gov:module').

Injected keys are authoritative and overwrite any caller-provided value under the same keys.

parameterdescription
decide_(Required.) _ object.
decide.case_(Required.) _ string. The decision context.
decide.motivatedboolean|null. Whether to request a motivated decision (defaults to false).

- If false, the contract calls governance:decide/2 and returns only the verdict. - If true, the contract calls governance:decide/3 and returns both verdict and motivation.

QueryMsg::decision​

Return a recorded decision by its unique identifier.

The returned record is created by ExecuteMsg::RecordDecision and includes the decision payload (case/verdict, optional motivation) along with constitution metadata (revision/hash) and block metadata.

parameterdescription
decision_(Required.) _ object.
decision.decision_id_(Required.) _ integer. The unique decision identifier.

QueryMsg::decisions​

Return a paginated list of recorded decisions.

Decisions are ordered by their unique identifier in ascending order.

parameterdescription
decisions_(Required.) _ object.
decisions.limitinteger|null. Optional maximum number of decisions to return (default: 10).
decisions.start_afterinteger|null. Optional decision ID to start after (exclusive).

MigrateMsg​

Migrate message.

Reserved for future migrations.

MigrateMsg::MigrateMsg​

Migrate message.

Reserved for future migrations.

parameterdescription

Responses​

constitution​

Response returned by QueryMsg::Constitution.

propertydescription
constitution_(Required.) _ Binary. The stored constitution (raw Prolog program bytes).

constitution_status​

Response returned by QueryMsg::ConstitutionStatus.

propertydescription
constitution_hash_(Required.) _ Binary. The stored constitution hash (32 bytes, sha256).
constitution_revision_(Required.) _ integer. The constitution revision number.

The initially instantiated constitution has revision 0. Each successful revision increments it by 1.

decide​

Response returned by QueryMsg::Decide.

propertydescription
motivationstring|null. Optional motivation term returned as the third argument of decide/3.
verdict_(Required.) _ string. The verdict returned by the constitution as a Prolog term string.

decision​

Response returned by QueryMsg::Decision.

propertydescription
author_(Required.) _ string. The author Bech32 address.
block_height_(Required.) _ integer. The block height at which the decision was recorded.
block_time_seconds_(Required.) _ integer. The block time (seconds since epoch) at which the decision was recorded.
case_(Required.) _ string. The case term as a Prolog term string.
case_hash_(Required.) _ Binary. The case hash (32 bytes, sha256).
constitution_hash_(Required.) _ Binary. The constitution hash at the time of decision (32 bytes, sha256).
constitution_revision_(Required.) _ integer. The constitution revision number at the time of decision.
decision_id_(Required.) _ integer. The unique decision identifier.
motivationstring|null. Optional motivation term as a Prolog term string.
motivation_hashBinary|null. The motivation hash (32 bytes, sha256).
verdict_(Required.) _ string. The verdict term as a Prolog term string.
verdict_hash_(Required.) _ Binary. The verdict hash (32 bytes, sha256).

decisions​

Response returned by QueryMsg::Decisions.

propertydescription
decisions_(Required.) _ Array<DecisionResponse>.

Definitions​

Binary​

A string containing Base64-encoded data.

type
string.

DecisionResponse​

Response returned by QueryMsg::Decision.

propertydescription
author_(Required.) _ string. The author Bech32 address.
block_height_(Required.) _ integer. The block height at which the decision was recorded.
block_time_seconds_(Required.) _ integer. The block time (seconds since epoch) at which the decision was recorded.
case_(Required.) _ string. The case term as a Prolog term string.
case_hash_(Required.) _ Binary. The case hash (32 bytes, sha256).
constitution_hash_(Required.) _ Binary. The constitution hash at the time of decision (32 bytes, sha256).
constitution_revision_(Required.) _ integer. The constitution revision number at the time of decision.
decision_id_(Required.) _ integer. The unique decision identifier.
motivationstring|null. Optional motivation term as a Prolog term string.
motivation_hashBinary|null. The motivation hash (32 bytes, sha256).
verdict_(Required.) _ string. The verdict term as a Prolog term string.
verdict_hash_(Required.) _ Binary. The verdict hash (32 bytes, sha256).

Rendered by Fadroma (@fadroma/schema 1.1.0) from axone-gov.json (12c459f623aed8e1)