Onym UI ↔ Notary: Stellar/Soroban Implementation
Implementation profile draft 0.1 — August 2026
This profile maps the technology-neutral Onym notary boundary onto Stellar ledgers, Soroban smart contracts, PLONK authorization evidence, and the current Onym HTTP transaction relayer.
This document is a concrete implementation of UI-Notary.md. The abstract specification remains authoritative for UI-facing semantics. This document defines how its objects, operations, receipts, evidence, finality, errors, and maintenance map to the current Stellar solution.
The document distinguishes:
- implemented behavior, which exists in the present Onym repositories;
- profile requirements, which are required for a complete conforming Stellar implementation; and
- gaps, where current code does not yet satisfy the complete boundary.
1. Conformance declaration
| Abstract concept | Stellar/Soroban mapping |
|---|---|
| Canonical system | Stellar network selected by network passphrase |
| Policy engine | One deployed Soroban sep-* contract instance |
| Canonical state | Soroban persistent/instance ledger entries |
| State commitment | BytesN<32> group commitment |
| Revision | u64 epoch |
| Authorization evidence | 1601-byte TurboPLONK proof plus ordered 32-byte public inputs |
| Implementation identity | Network, contract ID, Wasm/code hash, profile/release |
| Submission provider | Fee-paying onym-relayer HTTP service |
| Read provider | Current relayer proxy; direct Stellar RPC/indexer is the target alternative |
| Submission reference | Stellar transaction hash |
| Acceptance/finality evidence | Successful transaction in a closed Stellar ledger plus resulting state/event |
| Maintenance | Soroban persistent/instance/code TTL extension and restoration behavior |
The implementation profile identifier is:
onym:notary-implementation:stellar-soroban-sep-plonk-v1
Each governance flavor has its own logical NotaryProfile because its state
and authorization predicate differ:
onym:notary-profile:sep-anarchy-plonk-v1
onym:notary-profile:sep-oneonone-plonk-v1
onym:notary-profile:sep-democracy-plonk-v1
onym:notary-profile:sep-oligarchy-plonk-v1
onym:notary-profile:sep-tyranny-plonk-v1
Sharing the Soroban call names does not make the five policies one profile.
2. Ownership mapping
- The policy author publishes the
sep-*Rust contract, prover shape, verifying keys, fixtures, source revision, and release artifacts inonym-contracts. - The notary deployer deploys a selected Wasm artifact to a selected Stellar network and controls only the operator powers encoded by that contract.
- The Stellar validator set establishes canonical ledgers through Stellar Consensus Protocol.
- The transaction-relayer operator holds a funded Stellar account, selects RPC endpoints, simulates and submits invocations, pays network/resource fees, and exposes an HTTP API.
- The RPC or indexer operator serves recent transactions, events, and ledger entries but does not independently define canonical contract state.
- The group pins network, governance flavor, contract ID, release/profile, and genesis evidence.
- The UI publisher presents selection and may broker payment, but is not a contract authority.
The same organization can operate the deployment, HTTP relayer, and RPC, but a client must not treat their combined API response as independent canonical evidence.
3. Physical topology
┌──────────────────────────────────────────────────────────────────────┐
│ iOS / Android │
│ │
│ View / flow / interactor │
│ ├────────> Onym identity and group state │
│ ├────────> Swift/Kotlin SDK + Rust FFI prover │
│ ├────────> SepContractClient / SEPContractClient │
│ └────────> canonical relayer JSON invocation │
└──────────────────────────────┬───────────────────────────────────────┘
│ HTTPS POST
v
┌────────────────────────┐
│ onym-relayer │
│ auth · rate limit │
│ allowlist · validation │
│ Stellar fee account │
└───────────┬────────────┘
│ stellar contract invoke
│ simulate / sign / submit
v
┌────────────────────────┐
│ Stellar RPC + Core │
│ transaction lifecycle │
└───────────┬────────────┘
│ InvokeHostFunction
v
┌────────────────────────┐
│ sep-* Soroban contract │
│ validate PI + PLONK │
│ update persistent state│
│ emit contract event │
└───────────┬────────────┘
│ ledger close / RPC / indexer
v
client reconciliation
The relayer currently shells out to Stellar CLI. That is an implementation choice behind the profile; a direct Stellar SDK implementation can replace it without changing the abstract notary port.
4. Deployment identity
4.1 Target deployment object
The abstract NotaryDeployment maps as follows:
{
"deploymentVersion": 1,
"deploymentId": "onym:notary:stellar:<network-hash>:<contract-id>",
"profileId": "onym:notary-profile:sep-tyranny-plonk-v1",
"operator": "onym:key:<deployment-operator>",
"backend": {
"kind": "onym:notary-implementation:stellar-soroban-sep-plonk-v1",
"namespace": "stellar:<network-passphrase-hash>",
"instance": "C...",
"implementationHash": "<deployed-wasm-hash>"
},
"release": "vX.Y.Z",
"proofSystem": "turbo-plonk-bls12-381-kzg",
"verifierAnchors": "<content-addressed-vk-anchor-set>",
"submitEndpoints": ["onym:component:<transaction-relayer>"],
"readEndpoints": ["onym:component:<stellar-rpc-or-indexer>"],
"offers": ["<notary-offer-id>"],
"signature": "<operator-signature>"
}
Network identity is not a display label alone. It is bound by the Stellar
network passphrase or a canonical digest of it. public, testnet, and local
networks with different passphrases are different namespaces even if a UI
gives them similar names.
The contract ID selects one deployed instance. The Wasm hash identifies its implementation. Both are required to prevent an address, release label, or manifest entry from standing in for code verification.
4.2 Current manifest
The current contracts-manifest.json contains historical releases with:
{
"version": 1,
"releases": [
{
"release": "vX.Y.Z",
"publishedAt": "<timestamp>",
"contracts": [
{
"network": "testnet",
"type": "tyranny",
"id": "C..."
}
]
}
]
}
The mobile clients decode known network/type pairs and select a release. The relayer flattens the cumulative history into an allowlist. This is useful discovery, but it is not yet the target deployment object: it lacks the signed profile, Wasm/code hash, network-passphrase binding, verifier anchors, capabilities, privacy profile, and offers.
5. Group binding
The current clients persist an AnchorBinding:
{
"network": "testnet",
"governanceType": "tyranny",
"contractId": "C...",
"release": "vX.Y.Z"
}
This already establishes the critical sticky-binding rule: settings changes select defaults for new groups and do not mutate existing group anchors.
The complete Stellar GroupNotaryBinding also needs:
- abstract and Stellar profile versions;
- network-passphrase identity;
- deployed Wasm hash and verifier-anchor set;
- genesis commitment and epoch zero;
- creation transaction hash and ledger sequence;
- contract event or state evidence for creation; and
- declared migration/recovery policy.
An invitation carries enough information to reconstruct and verify the same binding. A receiver must not resolve “latest contract for this governance type” in place of the inviter's pinned contract.
6. State mapping
Every sep-* deployment stores its operator admin and restricted-mode control
in contract instance storage. Group state uses persistent storage keyed by a
32-byte group ID. Most mutable profiles also keep bounded history and
proof-replay markers.
The abstract snapshot maps to:
{
"snapshotVersion": 1,
"groupId": "<base64-32-byte-id>",
"deploymentId": "onym:notary:stellar:<network>:<contract-id>",
"profileId": "onym:notary-profile:sep-tyranny-plonk-v1",
"revision": 12,
"stateCommitment": "<base64-32-byte-field-element>",
"policyState": {
"timestamp": 1785580800,
"tier": 1,
"active": true,
"publicValues": "<flavor-specific-fields>"
},
"canonicalReference": {
"network": "stellar:<network-passphrase-hash>",
"contractId": "C...",
"ledger": 123456,
"transactionHash": "<64-hex-hash-or-read-reference>"
},
"evidence": "<transaction-meta-event-or-ledger-entry-evidence>"
}
The portable minimum is (commitment, epoch). Other current public fields
vary by flavor:
| Flavor | Additional public state |
|---|---|
| Anarchy | tier, active, timestamp, informational member_count |
| One-on-one | timestamp; epoch remains zero because no transition exists |
| Democracy | tier, active, occupancy commitment, threshold numerator, timestamp |
| Oligarchy | tier, active, occupancy commitment, admin threshold numerator, timestamp |
| Tyranny | tier, timestamp, separately readable admin public-key commitment |
The client must preserve “absent” versus “false/zero.” Current mobile
SepCommitmentEntry models only commitment and epoch as mandatory and a subset
of the remaining fields as optional, so it is not yet a lossless common state
representation for all five profiles.
7. Contract family and policy semantics
| Profile | Who can create | Who can transition | Current limits/shape |
|---|---|---|---|
| Anarchy | Relayer-funded caller, subject to deployment restriction | Any member who produces valid membership-based update evidence | Tiers 32/256/2048; member count stored as informational |
| One-on-one | Relayer-funded caller, subject to deployment restriction | Nobody; immutable after creation | Exactly two-party circuit; no update/history entrypoint |
| Democracy | Relayer-funded caller, subject to deployment restriction | Member quorum proven in one PLONK proof | Hidden occupancy commitment; current circuit threshold bound is limited |
| Oligarchy | Relayer-funded caller, subject to deployment restriction | Admin quorum proven in one PLONK proof | Hidden admin/member structure; public stored threshold and occupancy commitment |
| Tyranny | Relayer-funded caller, subject to deployment restriction | Holder of the pinned group-admin secret, proven without revealing it | Admin commitment and group ID are bound into update evidence |
“Relayer-funded caller” means the current HTTP relayer supplies its Stellar source account and signs the outer transaction. It does not mean that source account is the group's transition authority. Post-creation authorization comes from PLONK evidence except where a contract entrypoint explicitly calls Stellar address authorization.
Every deployment also has an operator admin established by the constructor.
Its set_restricted_mode power gates new group creation. It cannot advance or
rewrite existing group state under the current contract code.
8. Soroban operation mapping
| Abstract operation | Soroban entrypoint | Availability |
|---|---|---|
createState |
create_group |
Anarchy, one-on-one, democracy, tyranny |
createState |
create_oligarchy_group |
Oligarchy |
transitionState |
update_commitment |
All except one-on-one |
verifyStatement |
verify_membership |
All five |
readState |
get_commitment |
All five |
readHistory |
get_history |
All except one-on-one |
| Flavor read | get_admin_commitment |
Tyranny only |
maintainState |
bump_group_ttl |
All five |
| Deployment administration | set_restricted_mode |
All five; not group governance |
The HTTP relayer allowlists contract IDs per network and flavor, verifies the requested function is supported for that flavor, validates field lengths and encodings, and invokes Stellar CLI.
set_restricted_mode is exposed only when relayer bearer authentication is
configured, because the relayer's Stellar identity signs the administrative
call. This is an operator control plane and must remain separate from ordinary
group operations and user entitlements.
9. Authorization evidence mapping
The current PLONK profile uses:
- a 1601-byte proof;
- an ordered vector of 32-byte public inputs;
- per-flavor and, where applicable, per-tier verifying keys baked into Wasm;
- BLS12-381 verification through Soroban host primitives;
- proof replay records for state-changing calls; and
- read-only membership verification that does not consume the proof.
The important public-input bindings are:
| Flavor/operation | Ordered public statement |
|---|---|
| Anarchy create | [commitment, be32(0)] |
| Anarchy update | [c_old, be32(epoch_old), c_new] |
| One-on-one create | [commitment, be32(0)] |
| Democracy create | [commitment, be32(0), occupancy_initial] |
| Democracy update | [c_old, be32(epoch_old), c_new, occupancy_old, occupancy_new, threshold] |
| Oligarchy create | [commitment, be32(0), occupancy_initial] |
| Oligarchy update | [c_old, be32(epoch_old), c_new, occupancy_old, occupancy_new, admin_threshold] |
| Tyranny create | [commitment, be32(0), admin_commitment, group_id_fr] |
| Tyranny update | [c_old, be32(epoch_old), c_new, admin_commitment, group_id_fr] |
| Membership verification | [current_commitment, be32(current_epoch)] |
The contract reads prior state and policy values from storage and compares them
to the ordered public inputs before verifying the proof. For update operations,
c_new comes from the proof-bound public inputs and the next epoch is derived
as stored epoch plus one. A separate client-supplied new epoch or unbound next
commitment must not be forwarded.
Each public-input schema needs a content-addressed identifier. A bare JSON array plus contract flavor is the current de facto convention but is too easy to misorder across client, relayer, prover, and contract releases.
10. Current relayer protocol
The mobile client sends:
{
"network": "testnet",
"contractID": "C...",
"contractType": "tyranny",
"function": "update_commitment",
"payload": {
"group_id": "<base64-32-bytes>",
"proof": "<base64-1601-bytes>",
"publicInputs": [
"<base64-32-byte-c-old>",
"<base64-32-byte-epoch>",
"<base64-32-byte-c-new>",
"<base64-32-byte-admin-commitment>",
"<base64-32-byte-group-id-field>"
]
}
}
Byte fields may arrive as base64 or hex at the relayer. Current mobile clients emit base64. The relayer converts fixed-size values to the hex representation expected by Stellar CLI and normalizes selected byte fields back to base64 in read responses.
The top-level request selects network, contract ID, flavor, function, and payload. The relayer rejects mismatched flavor/function/contract combinations using a per-network allowlist.
10.1 Target operation mapping
Before the current request can be a complete implementation of abstract
NotaryOperation, it needs:
- operation/profile/schema versions;
- stable client
operationIdand idempotency semantics; - complete pinned deployment identity rather than only ID/type/network label;
- explicit expected state at the abstract layer;
- canonical public-statement schema identifier;
- component-scoped entitlement field;
- structured result/error codes; and
- unknown-outcome query support.
The function-specific payload remains the implementation mapping, not the UI's generic domain type.
11. Write lifecycle and receipt
The target lifecycle is:
1. UI reads and verifies the current contract state.
2. Local SDK creates the new commitment and PLONK proof.
3. UI serializes the profile-pinned operation.
4. Relayer validates auth, rate limit, allowlist, function, and payload.
5. Relayer simulates/prepares the Soroban invocation and estimates resources.
6. Relayer signs with its funded Stellar source account.
7. Relayer submits the transaction and returns its transaction hash.
8. Client or relayer polls Stellar RPC `getTransaction`.
9. `SUCCESS` identifies the closed ledger containing the transaction.
10. Client reads contract state or event evidence and confirms expected epoch
and commitment.
11. Client commits optimistic state locally.
Stellar RPC sendTransaction means queued/submitted, not successful execution;
the transaction hash must be checked with getTransaction. A conforming
receipt therefore includes:
{
"operationId": "<client-operation-id>",
"status": "finalized",
"submissionProvider": "onym:component:<relayer-id>",
"transactionHash": "<64-hex-hash>",
"ledger": 123456,
"contractId": "C...",
"event": "<group-created-or-commitment-updated-event>",
"acceptedRevision": 13,
"acceptedStateCommitment": "<base64-commitment>",
"resultEvidence": "<XDR-or-content-addressed-evidence>"
}
The current relayer write response is only:
{
"accepted": true,
"transactionHash": null,
"message": "<optional-stellar-cli-output>"
}
Because the current success path does not populate the transaction hash,
clients cannot implement independent transaction-status reconciliation from
that response. accepted: true currently means the relayer's CLI invocation
returned success; it must not be treated as the complete abstract receipt.
12. Read lifecycle and evidence
The present relayer invokes read-only functions through Stellar CLI with
--send no, parses the output, and returns normalized JSON. The mobile
ChainStateReading seam fetches (commitment, epoch) for selected flows; a
short-lived cache and bounded retry reduce request bursts.
The target read path must identify:
- network passphrase and contract ID;
- ledger or checkpoint observed;
- contract code/instance identity;
- exact state key and decoded schema;
- state value and revision;
- evidence needed to establish the value against canonical Stellar state; and
- RPC freshness/retention window.
A TLS response from the same company that submitted the write is not independent evidence. At minimum, the client should compare the returned state to transaction/event evidence and be able to use another RPC or indexer. High assurance profiles may require stronger ledger-header or proof verification.
Stellar RPC retains recent transactions and events for a bounded operator-set window; it is not a permanent history index. Long-term audit requires the client, notary provider, or an independent indexer to retain the necessary canonical references and evidence.
13. Events and history
Current mutable contracts emit typed events for:
- group creation;
- commitment update; and
- restricted-mode changes.
Events include a group ID topic and profile-specific data such as commitment, epoch, tier, occupancy commitment, threshold, and timestamp. A conforming adapter maps them to abstract receipts without treating the ledger timestamp as a user-authored time.
The contracts also retain bounded profile-specific commitment history where supported. Contract history and RPC event retention are different:
- contract history is state explicitly retained by the contract and subject to its own cap and TTL; and
- RPC history is an operator's recent query window over canonical ledgers.
Neither should be labeled complete history unless its explicit bounds are satisfied.
14. Stellar authorization layers
The solution has three distinct authorization layers:
- Group authorization evidence. PLONK proof and public inputs authorize a
transition under the selected
sep-*policy. - Stellar address authorization. Constructors, creation callers, and
deployment-administration calls use Soroban address authorization where the
contract invokes
require_auth(). - Relayer service access. The HTTP service may require a host-scoped bearer
token or future
SeatEntitlementbefore it spends resources.
These layers must not be conflated. Possessing the current relayer bearer token
does not authorize a group transition without valid PLONK evidence. A valid
group proof does not authorize set_restricted_mode. An App Store purchase is
neither a Soroban signature nor a group proof.
The current app credential is a build/deployment bearer token scoped to the configured relayer host. It is not yet the per-user, per-seat entitlement described by the economic model.
15. State TTL, archival, and maintenance
Soroban contract code, instances, and contract-data entries have ledger-based lifetimes. The current family uses:
- instance storage for operator admin, restricted mode, and deployment-level counters;
- persistent storage for group state, history, and proof-replay entries; and
- permissionless
bump_group_ttl(group_id)maintenance for group state.
Persistent and instance entries can become archived when their TTL expires and require restoration before normal access; exact limits and fees are network parameters, not constants for the Onym abstract protocol. Temporary state, if introduced by a future profile, has different deletion semantics and must not be used where permanent loss violates group correctness.
The Stellar profile must declare:
- which keys each operation reads and writes;
- which keys
bump_group_ttlextends; - whether proof-replay markers live as long as the state they protect;
- code and instance lifetime management;
- restoration behavior and payer;
- what the UI sees when state is archived; and
- how monitoring prevents unexpected unavailability.
TTL extension is maintenance, not governance. It cannot change a commitment, epoch, threshold, authority, or group status.
16. Payment and fee mapping
There are three possible paid layers:
- notary deployment service: availability, monitoring, upgrades permitted by profile, and retained state support;
- transaction relayer: simulation, source account, Stellar resource and inclusion fees, submission, and status service; and
- RPC/indexer: reads, event access, and retained history.
The current transaction relayer pays Stellar fees from its configured account. The mobile operation does not contain an end-user Stellar secret key. This is a useful fee-abstraction boundary but makes the relayer a service dependency, not a validity authority.
Off-chain Apple or other billing follows the abstract PaymentRequired and
SeatEntitlement flow. Store evidence stays at the billing broker. The relayer
receives a component-scoped entitlement or derived credential.
An alternative profile may make the user pay a Stellar asset or native fee in the canonical transaction. That changes privacy, signing, simulation, refund, and authorization semantics and must be declared as another payment channel or profile capability.
No payment mechanism may bypass PLONK verification, prior-state checks, proof replay protection, or contract authorization.
17. Error mapping
The adapter maps distinct layers rather than returning one free-form message:
| Abstract error | Stellar source |
|---|---|
unsupported_profile |
Unknown release/profile/Wasm/verifier anchors |
deployment_mismatch |
Wrong network, contract ID, flavor, or code hash |
payment_required |
HTTP relayer/notary gateway refusal |
auth_required |
Relayer bearer/entitlement or Soroban authorization missing |
state_exists |
Contract GroupAlreadyExists |
state_not_found |
Contract GroupNotFound |
invalid_evidence |
Contract InvalidProof or verifier failure |
public_input_mismatch |
Contract PublicInputsMismatch |
stale_revision |
Stored commitment/epoch differs from public inputs |
replay |
Contract ProofReplay or duplicate operation mapping |
unauthorized |
AdminOnly, address authorization, or policy refusal |
state_unavailable |
Archived entry, missing RPC window, or unavailable read |
submission_failed |
HTTP, CLI, simulation, fee, RPC enqueue, or transaction failure |
outcome_unknown |
Lost response or transaction hash not yet resolved |
conflicting_state |
Read value contradicts verified transaction/event/binding |
Contract error numbers are implementation details that the Stellar adapter normalizes with the profile version. Raw CLI stderr and HTTP status remain diagnostic context, not the stable domain error.
Malformed but well-sized proof bytes can fail through different host or
contract paths. A client must distinguish valid = false, contract error,
transaction failure, and unavailable result without treating any failure as
membership success.
18. Security and privacy properties
- Proof witnesses and group secrets remain in the mobile SDK/FFI boundary.
- The contract receives only profile-declared commitments, proof, public inputs, group ID, and public policy values.
- The relayer can observe IP, time, network, contract, function, group ID, proof bytes, public inputs, and payload size.
- Stellar observers can inspect successful invocation inputs, contract state, and events included in public ledgers.
- A policy claiming hidden membership must disclose every remaining public value, including tier, epoch, occupancy/authority commitments, thresholds, and group identifiers where applicable.
- Relayer credentials and payment evidence never become public inputs or ledger state.
- The source account that pays and submits does not become group authority merely by appearing in the outer transaction.
- Verifier keys and Wasm identity are pinned; an unverified “latest” release cannot replace an existing binding.
- A proof or operation is accepted only against the state and policy values it cryptographically binds.
- Client state is durable only after transaction and state reconciliation.
Public-ledger metadata is a property of this implementation, not of the technology-neutral notary boundary. Another implementation may expose a different set of metadata and must use a different implementation profile.
19. Versioning and conformance
The Stellar profile pins:
- network passphrase identity;
- contract ID and deployed Wasm hash;
- governance flavor and abstract profile version;
- Soroban ABI and contract release;
- proof length, field encoding, public-input order, tier, and verifier anchors;
- relayer request/response version;
- state and event schemas;
- transaction receipt and reconciliation rules;
- TTL and restoration behavior; and
- payment/entitlement capability.
Cross-component fixtures must execute this path:
Swift/Kotlin input
-> Rust proof/PI bytes
-> relayer JSON
-> Soroban ABI values
-> contract verification/state/event
-> RPC/relayer response
-> normalized NotaryStateSnapshot and NotaryReceipt
Fixtures cover all five governance flavors, every tier, create/read/update or immutability, membership verification, invalid proof, wrong public-input order, stale epoch, replay, restricted creation, TTL, receipt reconciliation, and unknown outcome.
20. Current implementation gaps
The repositories implement a substantial portion of this profile, but the following gaps prevent full abstract conformance:
- deployment discovery lacks signed profiles, Wasm hashes, network-passphrase binding, verifier anchors, privacy declarations, offers, and operator signatures;
AnchorBindinglacks profile/version, Wasm hash, genesis transaction/ledger, and creation evidence;- relayer JSON is the de facto wire spec and has no version, operation ID, schema ID, entitlement, or outcome-query endpoint;
- write responses currently omit the Stellar transaction hash and therefore
cannot drive independent
getTransactionreconciliation; accepted: truecollapses CLI completion, submission, execution, and finality into one ambiguous field;- client read verification primarily trusts the selected HTTP relayer and is
currently narrow—
ChainStateReadingcovers selected tyranny flows rather than all governance profiles; - the common client state type omits flavor-specific fields needed for a lossless snapshot;
- mobile and relayer errors rely on HTTP bodies and CLI strings instead of a stable profile error taxonomy;
- proof/public-input schema identities are implicit in flavor/function/release;
- the relayer holds one configured source identity and optional bearer-token set rather than component-scoped user entitlements;
PaymentRequired, purchase validation, entitlement issuance, quota, renewal, refund, and revocation are not implemented;- long-term transaction/event evidence and independent read-provider selection are not implemented as a complete audit path;
- code/instance TTL monitoring, archived-state recovery UX, and payment for restoration are not expressed through the client boundary;
- migration between contract deployments or notary implementations is not specified; and
- cross-platform tests mirror many shapes but do not yet run one complete abstract-notary conformance suite.
21. Acceptance criteria
The Stellar implementation satisfies UI-Notary.md when:
- each deployment is cryptographically bound to network, contract ID, Wasm, verifier anchors, profile, and operator;
- every group persists genesis and binding evidence, not only a release label and contract ID;
- the UI can switch compatible transaction relayers and RPC providers without changing the contract binding;
- every write returns a stable operation ID and Stellar transaction hash;
sendTransaction/submission is distinct from successful closed-ledger inclusion;- the client reconciles successful transaction, contract event/state, epoch, and commitment before durable local commit;
- all five governance profiles have lossless state, operation, error, and conformance mappings;
- proof/public-input order is identified by a content-addressed schema;
- payment entitlement is scoped to the selected service and never enters group evidence or the ledger;
- TTL/archive/restore behavior is visible and cannot silently look like group deletion;
- operator restricted mode can gate creation but cannot transition existing group state; and
- a third-party UI, relayer, RPC provider, and deployment can interoperate using the published profile and test suite.
22. References
- Technology-neutral Onym notary boundary: UI-Notary.md
- Onym contract family: https://github.com/onymchat/onym-contracts
- Onym transaction relayer: https://github.com/onymchat/onym-relayer
- Onym iOS client: https://github.com/onymchat/onym-ios
- Onym Android client: https://github.com/onymchat/onym-android
- Stellar, “Smart Contracts”: https://developers.stellar.org/docs/learn/fundamentals/stellar-data-structures/contracts
- Stellar, “Transaction Lifecycle”: https://developers.stellar.org/docs/learn/fundamentals/transactions/transaction-lifecycle
- Stellar RPC,
sendTransaction: https://developers.stellar.org/docs/data/apis/rpc/api-reference/methods/sendTransaction - Stellar RPC,
getTransaction: https://developers.stellar.org/docs/data/apis/rpc/api-reference/methods/getTransaction - Stellar, “State Archival”: https://developers.stellar.org/docs/learn/fundamentals/contract-development/storage/state-archival
- Stellar, “Smart contract authorization”: https://developers.stellar.org/docs/build/guides/auth/contract-authorization
This document is maintained in the public onym-system repository and rendered here from a pinned commit. The repository is the authoritative source — latest version on main →