Entities & Sovereignty
Everything you create through Smart Engines — an account, a token, an HCS topic, a smart-app, a smart-agent — is an entity. Every entity carries a label that answers one question: who has to sign to act on this thing? That label is the sovereignty mode, and it’s enforced by the type system at compile time and at every request boundary at runtime, not by a checkbox in a UI.
What an entity is
Section titled “What an entity is”An entity is a binding: an on-chain ID, tied to a chain, tied to the validators that govern it, tied to its DKG-generated key material. These are the entity types:
| Entity type | Example | Created by |
|---|---|---|
account / wallet |
A managed chain account | user / smart-app |
token |
An XRPL issued token | user / smart-app |
topic |
A Hedera HCS topic | user / smart-app |
smart-app |
A deployed application identity | user |
agent |
A smart-agent identity | user |
settlement-quorum |
Cross-cluster settlement set | protocol |
protocol-treasury |
Protocol-owned account, one per chain. It does not pay for customer entity creation, which is payer-funded | genesis |
protocol-runner-pool |
Protocol-owned account, one per chain, that holds the runner-reward share | genesis |
cluster-operator |
A cluster’s on-chain identity | genesis |
faucet |
Testnet only: the account the test-token faucet dispenses from, under its own canonical rule | testnet genesis |
tenant-secrets-master |
Per-environment key entity that protects app secrets | protocol |
The entity registry
Section titled “The entity registry”Each entity produces a binding record that the network stores on every validator and replicates between them. The binding bytes are also pinned to IPFS as content-addressable public proof. The binding records which validators govern the entity, the threshold t, and the per-slot public keys.
Who pays to create an entity: the payer funds it
Section titled “Who pays to create an entity: the payer funds it”Creating an entity costs money on the underlying chain — funding a new account’s reserve, paying the create-transaction fee, issuing a token. In Smart Engines, the wallet creating the entity funds it. The smart-app pays by default; a customer can opt in to pay for their own. The payer is resolved in one place — the explicit payer in the request, otherwise the authenticated wallet, otherwise the request is refused with 400 — and never silently falls back to a protocol or operator key.
This holds on Hedera and XRPL, the chains that are live today, and for accounts and tokens alike. What the payer funds is only the chain cost — the new entity’s on-chain authority is native multisig from birth, controlled by the canonical rules, exactly as described below. Paying for an entity does not make you its sole signer.
| Entity shape | Example chains | What “payer-funded” means |
|---|---|---|
| Create-with-key | Hedera Live, Solana Coming next | Payer is the create-transaction fee-payer; the multisig is the controlling key from the first block |
| Account-model | XRPL Live, Stellar Coming next | Payer funds the new address; validators then threshold-sign the multisig install and master-key lock. An XRPL token is its own issuer account, and any issuer flags it requested (compliant, wipeable) are set first, before the multisig install |
| Deterministic address | Bitcoin Coming next, Polkadot Coming next | Payer signs a funding transfer to the pre-derived multisig address; no finalize step |
How an entity is created: host-mediated, two-phase
Section titled “How an entity is created: host-mediated, two-phase”Entity creation does not hit the validator directly. The internet-facing door is the host tier (smart-host BaaS). The host authenticates the caller, checks entity ownership, and resolves the source/payer server-side, then relays the request to the validator over the cluster-internal network. The validator’s transaction-prepare surface is not publicly routable; the SDK reaches entity creation only through the host’s /api/v3/baas/entities/... endpoints.
Creation itself is two-phase and payer-signed:
-
Prepare —
POST /api/v3/baas/entities/prepare-create(host) → the validators run the per-entity DKG (binding persisted, nothing submitted on-chain yet) and return the unsigned payer-funding transaction. -
Execute — the caller signs the funding blob and calls
POST /api/v3/baas/entities/execute-create(host); the validators finalize — threshold-signing the multisig install where the chain needs it — and the entity is live under its native multisig.
This is why “payer-funded” and “not your sole signer” hold at once: the payer signs only the funding leg in phase 1; the authority is the multisig the validators install in phase 2.
Agents are payer-funded entities too
Section titled “Agents are payer-funded entities too”A smart-agent is created the exact same way — entityType: 'agent' is a first-class citizen of the same two-phase prepare→execute flow, on XRPL. An agent is an account-shaped DKG entity bound to a type=agent rule; it follows the same path as an account. It is funded by the payer and born under the validator multisig, identical to an account or token. Two-phase agent creation settles only on XRPL, so a two-phase agent on any other chain is refused (400).
The two sovereignty modes
Section titled “The two sovereignty modes”There are exactly two modes:
securityMode: 'partial' | 'full'The default is 'full'.
| Mode | Who signs | What’s on-chain |
|---|---|---|
partial (product name: “mixed”) |
User + validator both sign | A nested authorization set: the user’s key and the validator multisig |
full |
Validator multisig alone | The validator multisig only |
The schema also enforces an invariant: partial requires both an entityId and an appOwnerPublicKey; full requires entityId (the owner key is ignored).
What the chain actually sees
Section titled “What the chain actually sees”The validator multisig is never a single opaque key. It is always a visible, chain-native, multi-member authorization set — so anyone looking at a block explorer (HashScan for Hedera, Bithomp for XRPL) can see the multi-member structure. Each chain expresses it with its own native primitive. The members are either the entity’s own DKG slot keys or the validators’ own keys for that chain:
| Chain | On-chain authorization primitive |
|---|---|
| Hedera Live | KeyList of ed25519 keys, with a threshold |
| XRPL Live | SignerList of member accounts, with a quorum (master key disabled) |
| Stellar Coming next | Weighted signer set via setOptions (low/med/high thresholds) |
| Polkadot Coming next | pallet_multisig — deterministic SS58 address from sorted signatories + threshold |
Signer structure: partial vs full
Section titled “Signer structure: partial vs full”%%{init: {'flowchart':{'htmlLabels':true,'curve':'basis'}}}%%
flowchart TD
subgraph FULL["full — validator multisig alone"]
F0["On-chain authorization set"]
F0 --> FT["threshold t of n"]
FT --> FV1["validator key 1"]
FT --> FV2["validator key 2"]
FT --> FVN["… validator key n"]
end
subgraph PARTIAL["partial / mixed — user + validator"]
P0["On-chain authorization set"]
P0 --> POuter["outer threshold = 2"]
POuter --> PUser["user / appOwner key"]
POuter --> PInner["validator multisig (nested)"]
PInner --> PIT["inner threshold t of n"]
PIT --> PV1["validator key 1"]
PIT --> PV2["validator key 2"]
PIT --> PVN["… validator key n"]
end
Per-entity DKG: fresh slots for every entity
Section titled “Per-entity DKG: fresh slots for every entity”Every entity created in partial or full mode runs its own DKG ceremony, so every entity gets fresh slot keys; slot keys are never reused across entities. Each validator holds only its own share of each slot key; the cluster publishes only the public keys. Some entities, such as XRPL entities created through the API, list each validator’s own key for that chain instead of slot keys; those validator keys are the same across the entities that list them.
When the validator set changes later, the cluster reshares the off-chain secret shares — and the slot public keys stay the same, so an on-chain list built from slot keys does not change.
Sovereignty is not the same as rules
Section titled “Sovereignty is not the same as rules”Two orthogonal questions run before any transaction is signed:
| Question | Concern | Lives in |
|---|---|---|
| Who signs this? | Sovereignty — key topology | securityMode + the on-chain authorization set |
| Is this action allowed right now? | Rules — business policy | the Rules Engine |
A rule (e.g. “minting only allowed during this window”) can fire in either sovereignty mode. They compose; they don’t replace each other.