Accounts Module

The accounts module is the current named-account and key-management feature that ships in sigilaris-core. Its public surface lives under org.sigilaris.core.application.feature.accounts.

Current Domain Surface

Current Tables

Named-account state lives in these tables. Unnamed accounts remain key-identified and do not allocate the same on-chain account record shape.

Current Transactions

These transactions all carry a real TxEnvelope, and mutating operations use typed nonce and non-empty wrappers at the public surface.

import java.time.Instant
import org.sigilaris.core.application.feature.accounts.domain.{
  Account,
  AccountNonce,
  KeyId20,
}
import org.sigilaris.core.application.feature.accounts.transactions.{
  AddKeyIds,
  CreateNamedAccount,
  RemoveKeyIds,
  UpdateAccount,
}
import org.sigilaris.core.application.transactions.{NetworkId, TxEnvelope}
import org.sigilaris.core.crypto.CryptoOps
import org.sigilaris.core.datatype.Utf8

val keyPair = CryptoOps.generate()
val keyId = KeyId20.fromPublicKey(keyPair.publicKey)
val envelope = TxEnvelope(
  networkId = NetworkId.unsafeFromLong(1),
  createdAt = Instant.parse("2026-04-15T00:00:00Z"),
  memo = Some(Utf8("accounts example")),
)

val create = CreateNamedAccount(
  envelope = envelope,
  name = Utf8("alice"),
  initialKeyId = keyId,
  guardian = None,
)
val update = UpdateAccount(
  envelope = envelope,
  name = Utf8("alice"),
  nonce = AccountNonce.Zero.toBigNat,
  newGuardian = Some(Account.Named(Utf8("guardian"))),
)
val addKey = AddKeyIds.unsafe(
  envelope = envelope,
  name = Utf8("alice"),
  nonce = AccountNonce.Zero.toBigNat,
  keyIds = Map(keyId -> Utf8("alice-main")),
  expiresAt = None,
)
val removeKey = RemoveKeyIds.unsafe(
  envelope = envelope,
  name = Utf8("alice"),
  nonce = AccountNonce.Zero.toBigNat,
  keyIds = Set(keyId),
)

Current Baseline

Current Limitations