Repository navigation
Releases: ACTA-Team/contracts-acta
Release list
Mainnet launch - 2026-06-30
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
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
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
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
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_vcto preventvc_idreuse 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_VAULTcap and paginatemigrate_vc_index(#35)
Performance
- perf: refactor
VaultIssuers/VaultDeniedIssuersto 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_vcextraction, flatevents.rs(#46) - fix:
scripts/deploy.shnow passes--contract_adminconstructor arg forvc-vault
v0.2.0 — Hardened vc-vault with O(1) index and batch issuance
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) toMAX_VCS_PER_VAULT = 1000. - Paginated
list_vc_ids+ newvc_count. Reads no longer return every vc_id in a single call.list_vc_ids(owner, offset, limit)returns up toMAX_LIST_LIMIT = 200per 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 legacyVaultVCIds(owner)Vec entries into the new index. Backend services can migrate vaults proactively without owner involvement.batch_issueentrypoint (max 5 VCs). Reuses onerequire_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 viaget_vc/verify_vc, butlist_vc_idsno longer includes revoked entries and the freed slot is reusable for new issuances.push()now movesVCParentto the destination soget_vc_parent(to_owner, vc_id)resolves correctly post-transfer. The source-sideVCStatusstays as a tombstone to preservevc_iduniqueness within that vault —issue_linkedwas 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_idsextends each enumeratedVaultVCIndexslot's TTL so vaults that are only ever listed (noget_vccalls) keep the index alive.revoke()now extendsextend_vault_ttlafter the index mutation.write_vc_countextends 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
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`