This guide helps you migrate from the service layer API (dids, credentials, wallets) to the new direct methods API introduced in Phase 4.
Overview
Phase 4 simplifies the TrustWeave API by removing the service layer indirection. Common operations are now available as direct methods on TrustWeave, making the API more intuitive and discoverable.
What Changed
Removed from Public API:
❌ trustweave.dids property
❌ trustweave.credentials property
❌ trustweave.wallets property
New Direct Methods:
✅ trustweave.createDid() - Direct DID creation
✅ trustweave.resolveDid() - Direct DID resolution
✅ trustweave.issueCredential() - Direct credential issuance
✅ trustweave.verifyCredential() - Direct credential verification
✅ trustweave.createWallet() - Direct wallet creation
valtrustweave=TrustWeave.create()// Create DID - Direct methodvaldid=trustweave.createDid()// Resolve DID - Direct method with sealed resultwhen(valresult=trustweave.resolveDid("did:key:...")){isDidResolutionResult.Success->{println("Resolved: ${result.document.id}")}isDidResolutionResult.Failure.NotFound->{println("DID not found: ${result.did}")}isDidResolutionResult.Failure.MethodNotRegistered->{println("Method not registered: ${result.method}")}// ... handle other cases}
// Issue credential - Simple overloadvalcredential=trustweave.issueCredential(issuer=issuerDid.id,keyId=issuerKeyId,subject=mapOf("id"toholderDid.id,"name"to"Alice"),credentialType="UniversityDegreeCredential")// Or use advanced overload with JsonElementvalcredential=trustweave.issueCredential(issuer=issuerDid.id,subject=buildJsonObject{put("id",holderDid.id)put("name","Alice")},config=IssuanceConfig(proofType=ProofType.Ed25519Signature2020,keyId=issuerKeyId,issuerDid=issuerDid.id),types=listOf("UniversityDegreeCredential"))// Verify credential - Returns sealed classvalverification=trustweave.verifyCredential(credential)when(verification){isCredentialVerificationResult.Valid->{println("Valid! ${verification.credential.id}")}isCredentialVerificationResult.Invalid.Expired->{println("Expired at ${verification.expiredAt}")}isCredentialVerificationResult.Invalid.Revoked->{println("Revoked")}// ... handle other cases}
Step 3: Update Wallet Operations
Before (Service Layer)
1
2
3
4
5
6
7
8
9
// Create walletvalwallet=trustweave.wallets.create(holderDid=holderDid.id,walletId="my-wallet-id",type=WalletType.InMemory)// Store credentialwallet.store(credential)
After (Direct Methods)
1
2
3
4
5
6
7
8
9
// Create wallet - Direct methodvalwallet=trustweave.createWallet(holderDid=holderDid.id,walletId="my-wallet-id",type=WalletType.InMemory)// Store credential - Same as beforewallet.store(credential)
valtrustweave=TrustWeave.create()// DIDs - Direct methodsvalissuerDid=trustweave.createDid()valholderDid=trustweave.createDid()valissuerKeyId=issuerDid.verificationMethod.first().id// Credentials - Direct methodsvalcredential=trustweave.issueCredential(issuer=issuerDid.id,keyId=issuerKeyId,subject=mapOf("id"toholderDid.id,"name"to"Alice"),credentialType="PersonCredential")// Verification - Sealed result handlingvalverification=trustweave.verifyCredential(credential)when(verification){isCredentialVerificationResult.Valid->{// Credential is valid}isCredentialVerificationResult.Invalid->{throwException("Invalid credential: ${verification.errors}")}}// Wallets - Direct methodsvalwallet=trustweave.createWallet(holderDid=holderDid.id)wallet.store(credential)
valverification=trustweave.verifyCredential(credential)when(verification){isCredentialVerificationResult.Valid->{// Credential is validprintln("Valid: ${verification.credential.id}")verification.warnings.forEach{println("Warning: $it")}}isCredentialVerificationResult.Invalid.Expired->{println("Expired at ${verification.expiredAt}")}isCredentialVerificationResult.Invalid.Revoked->{println("Revoked at ${verification.revokedAt}")}isCredentialVerificationResult.Invalid.InvalidProof->{println("Invalid proof: ${verification.reason}")}// ... handle all cases}
Better Discoverability: Common operations are obvious
1
2
3
4
// Obvious what these dotrustweave.createDid()trustweave.issueCredential(...)trustweave.createWallet(...)
Type Safety: Sealed results provide exhaustive handling
1
2
3
4
5
// Compiler ensures all cases handledwhen(valresult=trustweave.resolveDid(...)){isSuccess->...isFailure->...// Must handle all failure types}
Clearer Error Handling: Sealed classes make error handling explicit
1
2
3
4
5
6
7
8
9
// Before: Check boolean flagsif(!verification.valid){...}// After: Handle specific error typeswhen(verification){isValid->...isInvalid.Expired->...isInvalid.Revoked->...}
Migration Checklist
Replace trustweave.dids.create() with trustweave.createDid()
Replace trustweave.dids.resolve() with trustweave.resolveDid() and update error handling
Replace trustweave.credentials.issue() with trustweave.issueCredential()
Replace trustweave.credentials.verify() with trustweave.verifyCredential() and use sealed class handling
Replace trustweave.wallets.create() with trustweave.createWallet()
Update error handling to use sealed result types
Test all changes thoroughly
Update any custom code that accesses service layer
Complex Services (Unchanged)
Complex services remain as properties because they have many methods:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Blockchain operations - Still use servicevalanchor=trustweave.blockchains.anchor(data=credentialJson,serializer=JsonElement.serializer(),chainId=chainId)valreadData=trustweave.blockchains.read<JsonElement>(ref=anchor.ref,serializer=JsonElement.serializer())// Contract operations - Still use servicevalcontract=trustweave.contracts.draft(request)valbound=trustweave.contracts.bindContract(...)
Backward Compatibility
The service classes (DidService, CredentialService, WalletService) are now internal and cannot be accessed directly. If you have code that:
Accesses service properties directly: Update to use direct methods
Imports service classes: Remove imports (classes are internal)
Extends service classes: Use composition instead
Common Issues
Issue 1: Cannot Resolve dids, credentials, or wallets