Skip to content

Releases: ACTA-Team/contracts-acta

Mainnet launch - 2026-06-30

Choose a tag to compare

@aguilar1x aguilar1x released this 30 Jun 07:38
2427829

First production deployment of the ACTA contracts to Stellar mainnet (2026-06-30).

Code is unchanged from the existing testnet releases (did-stellar-registry v0.2.0, vc-vault v0.4.0, vc-vault-factory v0.1.0) — this marks the mainnet launch of those same versions.

Contract Version Mainnet ID / WASM hash
did-stellar-registry 0.2.0 CD6LSWW5ZSXOO5WAIHKQLQ262TW7BPI37PNEVMMA273BAPC65NN2AYXQ
vc-vault (template) 0.4.0 2bd0323a98acb8469606808368da6c79824f2dd8391494b94ddbeb3d22c1a957
vc-vault-factory 0.1.0 CCWNZ6UMUXCDOVP2TWOPVLI4KP4VY4YF7VKPN6XLYVHNFAT24NDB33CX

Factory fee: USDC (CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75), 10000000 = 1 USDC per credential, enabled.

vc-vault v0.4.0

Choose a tag to compare

@aguilar1x aguilar1x released this 23 Jun 02:07
7be51bb

Single-tenant rearchitecture: vaults are now deployed by vc-vault-factory, with open issuance (deny-by-exception) and fees centralized in the factory. The upgrade entrypoint was removed — the vault is immutable.

Testnet: installed as a template; WASM hash 2bd0323a98acb8469606808368da6c79824f2dd8391494b94ddbeb3d22c1a957. Instances are created via the factory (CDRFQRIP4FA3WMPWCSAM3XEY6EM6EGKRYZRSCSVZ5NHCF6AGEVR2XEPQ).

SHA-256 of the attached WASM matches the on-chain hash.

vc-vault-factory v0.1.0

Choose a tag to compare

@aguilar1x aguilar1x released this 23 Jun 02:07
7be51bb

First release. Deploys single-tenant vaults at deterministic addresses (keccak(salt‖XDR(owner))), centralizes fee configuration, and maintains the is_vault registry.

Testnet: CDRFQRIP4FA3WMPWCSAM3XEY6EM6EGKRYZRSCSVZ5NHCF6AGEVR2XEPQ — WASM hash f94a77905d87f9a195ea837414b4995c7d3d66bed0e287481710246bc1d5bdcd. Fee configured at 5 XLM (~1 USD) per credential.

did-stellar-registry v0.2.0

Choose a tag to compare

@aguilar1x aguilar1x released this 23 Jun 02:07
7be51bb

Allow key reuse across verification relationships, reject duplicate service id_suffix, contract-admin role spec, and clippy cleanup.

Testnet: CBUNQ3GX3ZQ4MF64H7JCYZMXLGOS47VPIQQS7NCR6V3KX6YP7O72L5QF — WASM hash 6835c23806075288284c89e133b271a3ac9c61977fbe49121f92c5431f29a0e7.

vc-vault v0.3.0

Choose a tag to compare

@aguilar1x aguilar1x released this 14 May 20:21
ae347aa

Testnet Deployment

Contract ID WASM hash
CATL4IDH7XXPDC2UHSEX2GP45PPBVDFSKUDTKCSQICDOJVDLYNKISXFH 775a141520de56fb4b1ebeb55d63e49fadf03f467ea8444cddb2caed2756ca8c

Network: Stellar Testnet (Test SDF Network ; September 2015)


Changes since v0.2.0

Security / correctness

  • fix: extend tombstone TTL in push_vc to prevent vc_id reuse after expiry (#47)

Features & hardening

  • feat: cap all user-controlled input lengths to prevent DoS (#25)
  • feat: emit events on all remaining state transitions (#26)
  • feat: validate fee bounds — non-negative, max cap (#29)
  • feat: remove MAX_VCS_PER_VAULT cap and paginate migrate_vc_index (#35)

Performance

  • perf: refactor VaultIssuers / VaultDeniedIssuers to O(1) map-based storage (#27)
  • perf: deduplicate storage reads in ensure_issuer_authorized (#28)

Refactoring

  • chore: remove all legacy migration scaffolding (#42)
  • refactor: align vc-vault architecture — constants, validator, storage split, VcVaultDataKey (#44)
  • refactor: post-architecture cleanup — __constructor, model→types, push_vc extraction, flat events.rs (#46)
  • fix: scripts/deploy.sh now passes --contract_admin constructor arg for vc-vault

v0.2.0 — Hardened vc-vault with O(1) index and batch issuance

Choose a tag to compare

@aguilar1x aguilar1x released this 08 May 04:53
0cf9392

Highlights

  • VC index refactored to O(1). Replaces the monolithic Vec<String> per vault with a map-based layout (VaultVCCount, VaultVCIndex, VaultVCPosition). Issue, revoke, and push are now constant-time regardless of how many credentials a vault holds. Effective cap moves from ~500 (CPU-bound) to MAX_VCS_PER_VAULT = 1000.
  • Paginated list_vc_ids + new vc_count. Reads no longer return every vc_id in a single call. list_vc_ids(owner, offset, limit) returns up to MAX_LIST_LIMIT = 200 per call; vc_count(owner) is an O(1) view. Full vault retrieval = 5 paginated calls.
  • migrate_vc_index(owner) for v0.1 → v0.2 transition. No-auth, deterministic helper that moves legacy VaultVCIds(owner) Vec entries into the new index. Backend services can migrate vaults proactively without owner involvement.
  • batch_issue entrypoint (max 5 VCs). Reuses one require_auth, one fee transfer (fee_override × n), and one TTL extension across the batch. Cap of 5 derives from Soroban's ~25 ledger-entries-per-tx limit (5 VCs × 4 entries + 1 shared count + ~3 for fee transfer = 24).

Public ABI changes

Change Notes
list_vc_ids(owner) → list_vc_ids(owner, offset: u32, limit: u32) Breaking. All callers must pass pagination parameters.
vc_count(owner) -> u32 New. O(1) read of VaultVCCount.
migrate_vc_index(owner) New. No auth required.
batch_issue(issuer, owner, vault_contract, issuer_did, fee_override, vcs) New. Up to 5 (vc_id, vc_data) tuples per call.

New error codes

Code Name Trigger
15 VaultFull Active VC count would exceed MAX_VCS_PER_VAULT (1000)
16 LimitTooLarge list_vc_ids limit exceeds MAX_LIST_LIMIT (200)
17 BatchTooLarge batch_issue called with more than MAX_BATCH_SIZE (5) VCs
18 BatchEmpty batch_issue called with an empty vcs list

Behavioral changes

  • revoke() now removes the VC from the active index. The payload and status remain queryable via get_vc / verify_vc, but list_vc_ids no longer includes revoked entries and the freed slot is reusable for new issuances.
  • push() now moves VCParent to the destination so get_vc_parent(to_owner, vc_id) resolves correctly post-transfer. The source-side VCStatus stays as a tombstone to preserve vc_id uniqueness within that vault — issue_linked was hardened to also verify the parent's payload presence so the tombstone can't be exploited as an orphan parent.
  • TTL refresh hardening. list_vc_ids extends each enumerated VaultVCIndex slot's TTL so vaults that are only ever listed (no get_vc calls) keep the index alive. revoke() now extends extend_vault_ttl after the index mutation. write_vc_count extends TTL on every write, matching the other index helpers.

Testnet deployment

Contract ID CBXC6LXBY5FGEG46VZ4AJ2AH2EJBINBA7BMILIEO4EJYI6ZTY7K7J5D5
WASM hash c8da61dd3dd46b2810a743d50a388c09a00f0b7e8e2df7ceb5a71c8ce5dc4dd8
WASM size 44,188 bytes (optimized)
Network passphrase Test SDF Network ; September 2015

Verify on Stellar Expert.

The v0.1.0 testnet deployment (CC3SQ7UTAQQDQF6PUQMQIGK3BMPB22OKMHE5Y5XELEX3JFAKC72SQOAM) remains in docs/deployments/testnet.md as historical record. v0.2.0 is a fresh deploy, not an upgrade — v0.1.0 was never initialized on chain and had no production state to preserve.

Capacity comparison

Metric v0.1.0 v0.2.0
Max active VCs per vault ~500 (CPU-bound) 1,000 (explicit cap)
issue() CPU at vault size N grows O(N) constant ~150k instr
list_vc_ids cost one Vec decode N constant-cost entry reads (paginated)
Multi-VC issuance cost N transactions ⌈N/5⌉ transactions

Tests

test result: ok. 93 passed; 0 failed

Included PRs

  • #30 — refactor: O(1) map-based VC index (closes #20)
  • #31 — feat: paginated list_vc_ids + vc_count (closes #21)
  • #32 — feat: migrate_vc_index for v0.1 → v0.2 vault migration (closes #22)
  • #33 — feat: batch_issue entrypoint up to 5 VCs (closes #24)
  • #34 — chore: release vc-vault v0.2.0 to testnet (closes #23)

v0.1.0 — Tranche 1: did:stellar Registry + Hardened vc-vault

Choose a tag to compare

@aguilar1x aguilar1x released this 07 May 05:18
f03e3a7

Tranche 1 — SCF Deliverables

This release covers all Tranche 1 deliverables for the ACTA SCF grant.


Deliverable 1 & 2 — `did:stellar` Method Specification + Registry Contract

  • Published the `did:stellar` v0.1 method specification at `docs/did-spec/did-stellar-v0.1.md`, covering:
    • Identifier syntax and generation
    • On-chain data model (`DidRecord`)
    • Contract ABI with optimistic concurrency
    • DID Document construction rules
    • Proof of control protocol (Ed25519 + JCS)
    • Security and privacy considerations
    • Normative test vectors (vectors 1–4)
  • Normative test vectors at `docs/did-spec/test-vectors/vectors.json`

Deliverable 3 — Contract Test Suite

  • `did-stellar-registry`: 56 tests — registration, update, controller transfer, deactivation, authorization enforcement, boundary validation, optimistic concurrency, event payloads
  • `vc-vault`: 63 tests — full ABI coverage including fee tiers, sponsored vaults, issuer authorization, VC lifecycle, push, linked VCs, admin governance

Deliverable 4 — Hardened `vc-vault` Contract

  • Typed error handling: 14 structured error codes
  • USDC fee tier system with custom per-vault overrides
  • Issuer authorization and blocklist enforcement
  • Complete observability: 10 typed events covering all state transitions
  • Interface documentation: `contracts/vc-vault/README.md`

Testnet Deployments

Contract Contract ID
`did-stellar-registry` `CB7ATU7SF5QUKJMSULJDJVWJZVDXC23HTZX6NFUDTSFPVT6MA575NNZJ`
`vc-vault` `CC3SQ7UTAQQDQF6PUQMQIGK3BMPB22OKMHE5Y5XELEX3JFAKC72SQOAM`

Network: Stellar Testnet
Full deployment record: `docs/deployments/testnet.md`