Contrats

Référence des Contrats

L'interface publique des contrats Soroban d'ACTA, pour les équipes qui intègrent au niveau du contrat (Rust, CLI ou outillage personnalisé) sans passer par l'API ACTA. Le code source se trouve dans le dépôt contracts-acta ; les codes d'erreur sont sur et l'interface du registre did:stellar est documentée dans la section .

Aperçu

ContractVersionRôle
vc-vault0.4.0Coffre de credentials mono-locataire, un par propriétaire, instancié par la factory à partir d'un template WASM
vc-vault-factory0.1.0Une par réseau ; déploie les coffres de manière déterministe et fournit le devis des frais d'émission
did-stellar-registry0.2.0Enregistrements de DID émetteurs (voir )

vc-vault

Chaque coffre est construit par la factory avec (vault_owner, contract_admin, did_uri, factory_address). L'admin du coffre est initialement le propriétaire.

Rôles du coffre

RôlePeut appeler
contract_adminnominate_admin ; un nominé appelle accept_contract_admin (pas de pouvoirs d'upgrade ni de frais)
Admin du coffre (propriétaire par défaut)set_vault_admin, deny_issuer, allow_issuer, revoke_vault, push
vault_ownerset_vault_did, revoke
Tout émetteur non bloquéissue, batch_issue

Fonctions du coffre

FunctionAuthNotes
version() -> StringAucuneRenvoie la version du crate, par exemple "0.4.0"
vault_owner() -> AddressAucune
vault_did() -> Option<String>Aucune
set_vault_did(did_uri)Propriétaire du coffredid_uri jusqu'à 256 octets
set_vault_admin(new_admin)Admin du coffre
deny_issuer(issuer_addr)Admin du coffreSans effet si déjà bloqué ; liste plafonnée à 1 000
allow_issuer(issuer_addr)Admin du coffreSans effet si absent
revoke_vault()Admin du coffreIrréversible ; bloque toutes les écritures
issue(vc_id, vc_data, vault_contract, issuer_addr, issuer_did) -> StringÉmetteurPrélève sur l'émetteur les frais devisés par la factory ; un vc_id en double échoue
batch_issue(issuer_addr, vault_contract, issuer_did, vcs) -> Vec<String>Émetteurvcs = liste de (vc_id, vc_data), 1 à 5 entrées ; transfert de frais unique de unitaire x n
revoke(vc_id, date)Propriétaire du coffreLe credential doit être valide ; le statut devient Revoked(date)
push(vc_id, dest_vault)Admin du coffreDéplace un credential valide vers un autre coffre déployé par la factory avec le même propriétaire, puis le supprime localement
receive_push(source_vault, source_owner, vc_id, vc_data, issuer_did)Coffre sourceValide la source via is_vault de la factory et la règle du même propriétaire
list_vc_ids(offset, limit) -> Vec<String>Aucunelimit jusqu'à 200
vc_count() -> u32Aucune
get_vc(vc_id) -> Option<VerifiableCredential>AucuneRenvoie { id, data, issuance_contract, issuer_did } ; data est la charge utile chiffrée
verify_vc(vc_id) -> VCStatusAucuneValid, Invalid ou Revoked(date). Statut uniquement : ne prouve pas qui a émis ; vérifiez issuer_did pour cela
list_denied_issuers(offset, limit) -> Vec<Address>Aucunelimit jusqu'à 200
denied_issuer_count() -> u32Aucune
nominate_admin(new_admin) / accept_contract_admin()Admin / nominéTransfert de contract-admin en deux étapes

Limites du coffre

LimiteValeur
vc_idmax 64 octets
vc_datamax 10 000 octets
did_uri / issuer_didmax 256 octets
datemax 64 octets
Taille de lotmax 5 credentials
Taille de page de listemax 200
Émetteurs bloquésmax 1 000

Événements du coffre

ContractInitialized, VaultCreated, AdminNominated, AdminTransferred, VaultAdminChanged, VaultDidChanged, IssuerDenied, IssuerAllowed, VaultRevoked, VCIssued (par credential, également émis sur les lots et sur receive_push), VCRevoked, VCPushed.

vc-vault-factory

Construite une fois par réseau avec VaultInitMeta { vault_hash, contract_admin }. Le hash du template n'a aucun setter : livrer un nouveau code de coffre implique de déployer une nouvelle factory.

Fonctions de la factory

FunctionAuthNotes
deploy(owner, did_uri, user_salt) -> AddressPropriétaireDéploie le coffre du propriétaire ; émet VaultDeployed
deploy_sponsored(deployer, owner, did_uri, user_salt) -> AddressDeployerLe sponsor paie et signe ; le coffre appartient à owner ; émet SponsoredVaultDeployed
is_vault(vault_address) -> boolAucuneVrai si et seulement si déployé par cette factory
quote_fee(issuer) -> FeeQuoteAucune{ enabled, amount, token, dest } ; le tarif personnalisé par émetteur (avec expiration optionnelle) prime sur le tarif standard
set_fee_config(token, dest, standard)Admin
set_fee_enabled(enabled)AdminL'activation exige que token + dest + standard soient configurés
set_fee_standard(amount) / set_min_fee(amount)AdminMontants validés non négatifs, au-dessus des frais minimum et au plus 10^18
set_fee_custom(issuer, amount, expires_at?) / remove_fee_custom(issuer)AdminL'expiration doit être dans le futur
nominate_admin / accept_admin / get_adminAdmin / nominé / aucuneTransfert en deux étapes

Adresses déterministes

L'adresse du coffre est dérivée avant le déploiement, sans table de correspondance :

text
deploy_salt = keccak256(user_salt (32 bytes) || XDR(ScAddress(owner)))

Le propriétaire est encodé en XDR ScAddress canonique (pas la forme textuelle G...). Le même couple (owner, user_salt) donne toujours la même adresse ; le sel par défaut est 32 octets à zéro (un coffre canonique par propriétaire). Mélanger le propriétaire dans le sel évite les collisions entre propriétaires et le front-running.

Contrats déployés

Mainnet (passphrase Public Global Stellar Network ; September 2015)

ContractID / hash
vc-vault-factoryCCWNZ6UMUXCDOVP2TWOPVLI4KP4VY4YF7VKPN6XLYVHNFAT24NDB33CX
vc-vault template WASM2bd0323a98acb8469606808368da6c79824f2dd8391494b94ddbeb3d22c1a957
Configuration des fraisActivés ; 1 USDC par credential (SAC USDC CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75)

Testnet (passphrase Test SDF Network ; September 2015)

ContractID / hash
vc-vault-factoryCDRFQRIP4FA3WMPWCSAM3XEY6EM6EGKRYZRSCSVZ5NHCF6AGEVR2XEPQ
vc-vault template WASM2bd0323a98acb8469606808368da6c79824f2dd8391494b94ddbeb3d22c1a957
Configuration des fraisActivés ; 5 XLM par credential (SAC XLM natif)

Le contrat vc-vault n'a pas d'identifiant de contrat autonome sur aucun des deux réseaux : il n'existe que sous forme d'instances par propriétaire déployées par la factory.

Immutabilité et stockage

  • Pas de points d'entrée d'upgrade : ni le coffre (depuis la 0.4.0) ni la factory ne peuvent remplacer leur code.
  • Les données de credentials et les index du coffre résident dans le stockage Soroban persistant ; le stockage d'instance contient l'état d'administration. Les TTLs sont prolongés à la fois en lecture et en écriture (seuil ~30 jours, extension ~180 jours à des ledgers de 5 secondes).
  • Les contrats sont compilés pour la cible wasm32v1-none et optimisés avec la CLI Stellar.