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 show the legacy service API, which has been
removed and no longer compiles (each such block is marked REMOVED 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)
trustWeave.blockchains — Anchoring via BlockchainService
trustWeave.contracts — SmartContractService
Migration Steps
Step 1: Update DID Operations
Before (Service Layer)
1
2
3
4
5
6
7
8
9
// REMOVED API, shown only for comparison. `dids`, `credentials` and `wallets` no longer exist// on TrustWeave; this block does not compile against the current release.valtrustweave=TrustWeave.quickStart()// Create DIDvaldid=trustweave.dids.create()// Resolve DIDvalresult=trustweave.dids.resolve("did:key:...")
importorg.trustweave.trust.quickStartimportorg.trustweave.trust.types.getOrThrowDidvaltrustweave=TrustWeave.quickStart()// Create DID - Direct method returning a sealed DidCreationResult (unwrapped here)valdid=trustweave.createDid().getOrThrowDid()// 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}
// REMOVED API, shown only for comparison. `dids`, `credentials` and `wallets` no longer exist// on TrustWeave; this block does not compile against the current release.// Issue credentialvalcredential=trustweave.credentials.issue(issuer=issuerDid.id,subject=jsonData{"id"toholderDid.id"name"to"Alice"},config=IssuanceConfig(proofType=ProofType.Ed25519Signature2020,keyId=issuerKeyId,issuerDid=issuerDid.id),types=listOf("UniversityDegreeCredential"))// Verify credentialvalverification=trustweave.credentials.verify(credential)if(verification.valid){println("Valid!")}
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
10
11
// REMOVED API, shown only for comparison. `dids`, `credentials` and `wallets` no longer exist// on TrustWeave; this block does not compile against the current release.// Create walletvalwallet=trustweave.wallets.create(holderDid=holderDid.id,walletId="my-wallet-id",type=WalletType.InMemory)// Store credentialwallet.store(credential)
// REMOVED API, shown only for comparison. `dids`, `credentials` and `wallets` no longer exist// on TrustWeave; this block does not compile against the current release.valtrustweave=TrustWeave.quickStart()// DIDsvalissuerDid=trustweave.dids.create()valholderDid=trustweave.dids.create()valissuerKeyId=issuerDid.verificationMethod.first().id// Credentialsvalcredential=trustweave.credentials.issue(issuer=issuerDid.id,subject=jsonData{"id"toholderDid.id"name"to"Alice"},config=IssuanceConfig(proofType=ProofType.Ed25519Signature2020,keyId=issuerKeyId,issuerDid=issuerDid.id),types=listOf("PersonCredential"))valverification=trustweave.credentials.verify(credential)if(!verification.valid){throwException("Invalid credential")}// Walletsvalwallet=trustweave.wallets.create(holderDid=holderDid.id)wallet.store(credential)
// REMOVED API, shown only for comparison. `dids`, `credentials` and `wallets` no longer exist// on TrustWeave; this block does not compile against the current release.valresult=trustweave.dids.resolve("did:key:...")if(result.document!=null){// Success}else{// Failure - check result.metadata.error}
After
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
7
8
// REMOVED API, shown only for comparison. `dids`, `credentials` and `wallets` no longer exist// on TrustWeave; this block does not compile against the current release.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}
Benefits of Migration
Simpler API: Direct methods are more intuitive
1
2
3
4
// REMOVED API, shown only for comparison. `dids`, `credentials` and `wallets` no longer exist// on TrustWeave; this block does not compile against the current release.// Before: trustweave.dids.create()// After: trustweave.createDid()
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
Error:
1
Unresolved reference 'dids'
Solution:
Replace with direct methods:
1
2
3
4
5
6
7
// REMOVED API, shown only for comparison. `dids`, `credentials` and `wallets` no longer exist// on TrustWeave; this block does not compile against the current release.// Beforevaldid=trustweave.dids.create()// Aftervaldid=trustweave.createDid()
Type mismatch: expected DidResolutionResult, found ...
Solution:
Update to handle sealed result:
1
2
3
4
5
6
7
8
9
10
11
12
13
// REMOVED API, shown only for comparison. `dids`, `credentials` and `wallets` no longer exist// on TrustWeave; this block does not compile against the current release.// Beforevalresult=trustweave.dids.resolve(did)if(result.document!=null){...}// Afterwhen(valresult=trustweave.resolveDid(did)){isDidResolutionResult.Success->{// result.document available}else->{...}}
Testing Migration
Run Tests: Ensure all tests pass with new API
Check Error Handling: Verify sealed result handling works
Validate Functionality: Test all DID, credential, and wallet operations