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.
Snippet convention: Blocks labeled Before still show the legacy service API (e.g. trustweave.credentials.verify and a boolean-style verification.valid). Prefer the After patterns: sealed VerificationResult (is VerificationResult.Valid / exhaustive when) and allErrors for messages—not the old valid flag.
What Changed
Removed from Public API:
trustweave.dids property
trustweave.credentials property
trustweave.wallets property
New Direct Methods:
trustWeave.createDid() — DID creation (DidCreationResult)
trustWeave.resolveDid() — DID resolution (DidResolutionResult)
valtrustweave=TrustWeave.quickStart()// 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}
importorg.trustweave.credential.results.getOrThrow// Issue credential — DSL returning IssuanceResultvalcredential=trustWeave.issue{credential{type("UniversityDegreeCredential")issuer(issuerDid)subject{id(holderDid)"name"to"Alice"}}signedBy(issuerDid=issuerDid,keyId=issuerKeyId)}.getOrThrow()// Verify credential — sealed VerificationResultvalverification=trustWeave.verify(credential)when(verification){isVerificationResult.Valid->{println("Valid! ${verification.credential.id}")}isVerificationResult.Invalid.Expired->{println("Expired at ${verification.expiredAt}")}isVerificationResult.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)
when(valresult=trustweave.resolveDid("did:key:...")){isDidResolutionResult.Success->{// Access result.document directlyprintln("Resolved: ${result.document.id}")}isDidResolutionResult.Failure.NotFound->{println("DID not found: ${result.did}")}isDidResolutionResult.Failure.MethodNotRegistered->{println("Method not registered: ${result.method}")println("Available: ${result.availableMethods}")}// ... exhaustive handling}
Credential Verification
Before
1
2
3
4
5
6
valverification=trustweave.credentials.verify(credential)if(verification.valid){// Success}else{// Check error details (e.g. allErrors) and trust-layer helpers (e.g. proofValid) as needed.}
After
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
valverification=trustWeave.verify(credential)when(verification){isVerificationResult.Valid->{// Credential is validprintln("Valid: ${verification.credential.id}")verification.warnings.forEach{println("Warning: $it")}}isVerificationResult.Invalid.Expired->{println("Expired at ${verification.expiredAt}")}isVerificationResult.Invalid.Revoked->{println("Revoked at ${verification.revokedAt}")}isVerificationResult.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.issue{...}trustWeave.wallet{holder(...);provider(...)}
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.issue { } (handle IssuanceResult)
Replace trustweave.credentials.verify() with trustWeave.verify() and use sealed class handling
Replace trustweave.wallets.create() with trustWeave.wallet { … } (handle WalletCreationResult)
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