This tutorial provides a comprehensive guide to using TrustWeave’s Wallet API. You’ll learn how to create wallets, store credentials, organize them, and create presentations.
Outcome: Creates a wallet via TrustWeave.wallet { } and unwraps WalletCreationResult with getOrThrow() (see result types).
Same pattern with TrustWeave.build
Use TrustWeave.build { keys { ... }; did { ... }; factories(walletFactory = ...) } when you need explicit KMS/DID/wallet factory wiring instead of defaults-only demos.
Testkit Wallets
BasicWallet and InMemoryWallet remain available for lightweight unit tests:
importorg.trustweave.credential.model.vc.VerifiableCredentialimportkotlinx.serialization.json.buildJsonObjectimportkotlinx.serialization.json.put// Create a credentialvalcredential=VerifiableCredential(id="https://example.com/credentials/123",type=listOf("VerifiableCredential","PersonCredential"),issuer="did:key:issuer",credentialSubject=buildJsonObject{put("id","did:key:subject")put("name","Alice")put("email","alice@example.com")},issuanceDate="2023-01-01T00:00:00Z")// Store itvalcredentialId=wallet.store(credential)println("Stored credential: $credentialId")
Outcome: Persists a credential in the wallet and returns its storage identifier.
if(walletisCredentialOrganization){// Create a collectionvalworkCollection=wallet.createCollection(name="Work Credentials",description="Professional credentials and certifications")// Add credentials to collectionwallet.addToCollection(credentialId,workCollection)// Get credentials in collectionvalworkCreds=wallet.getCredentialsInCollection(workCollection)println("Work credentials: ${workCreds.size}")// List all collectionsvalcollections=wallet.listCollections()collections.forEach{collection->println("Collection: ${collection.name} (${collection.credentialCount} credentials)")}}
Outcome: Creates collections, adds credentials, and lists collection metadata when the wallet supports organization.
Tags
Tag credentials for easy filtering:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(walletisCredentialOrganization){// Tag a credentialwallet.tagCredential(credentialId,setOf("important","verified","work"))// Get tags for a credentialvaltags=wallet.getTags(credentialId)println("Tags: $tags")// Find credentials by tagvalimportantCreds=wallet.findByTag("important")// Get all tagsvalallTags=wallet.getAllTags()println("All tags: $allTags")// Remove tagswallet.untagCredential(credentialId,setOf("work"))}
Outcome: Demonstrates tagging workflows—ideal for building saved searches or UI filters.
Metadata
Add custom metadata to credentials:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if(walletisCredentialOrganization){// Add metadatawallet.addMetadata(credentialId,mapOf("source"to"issuer.com","verified"totrue,"priority"to"high"))// Get metadatavalmetadata=wallet.getMetadata(credentialId)println("Metadata: ${metadata?.metadata}")// Add noteswallet.updateNotes(credentialId,"This credential was verified manually")}
valvalidWorkCredentials=wallet.query{byTypes("WorkCredential","EmploymentCredential","CertificationCredential")bySubject("did:key:subject")notExpired()notRevoked()valid()// Has proof, not expired, not revoked}
Query Examples
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Find expired credentialsvalexpired=wallet.query{expired()}// Find revoked credentialsvalrevoked=wallet.query{revoked()}// Find credentials by issuer and typevalspecific=wallet.query{byIssuer("did:key:university")byType("DegreeCredential")}
Creating Presentations
Basic Presentation
1
2
3
4
5
6
7
8
9
10
11
if(walletisCredentialPresentation){valpresentation=wallet.createPresentation(credentialIds=listOf(credentialId1,credentialId2),holderDid="did:key:holder",options=mapOf("holderDid"to"did:key:holder","proofType"to"Ed25519Signature2020","challenge"to"random-challenge-123",domain="example.com"))println("Created presentation with ${presentation.verifiableCredential.size} credentials")}
if(walletisCredentialLifecycle){// Archive old credentialswallet.archive(oldCredentialId)// Get archived credentialsvalarchived=wallet.getArchived()println("Archived credentials: ${archived.size}")// Unarchive if neededwallet.unarchive(oldCredentialId)}
Refreshing Credentials
1
2
3
4
5
6
7
if(walletisCredentialLifecycle){// Refresh a credential (if refresh service available)valrefreshed=wallet.refreshCredential(credentialId)if(refreshed!=null){println("Credential refreshed")}}
Manage multiple wallets with an instance-scoped directory:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
importorg.trustweave.wallet.WalletDirectoryvaldirectory=WalletDirectory()// Register walletsvalwallet1=BasicWallet()valwallet2=InMemoryWallet()directory.register(wallet1)directory.register(wallet2)// Find walletsvalretrieved=directory.get(wallet1.walletId)valbyDid=directory.getByDid("did:key:wallet")// Find wallets with specific capabilitiesvalorgWallets=directory.findByCapability(CredentialOrganization::class)valwalletsWithCollections=directory.findByCapability("collections")
// Kotlin stdlibimportkotlinx.coroutines.runBlockingimportkotlinx.serialization.json.buildJsonObjectimportkotlinx.serialization.json.put// TrustWeave coreimportorg.trustweave.trust.TrustWeaveimportorg.trustweave.trust.dsl.credential.DidMethodsimportorg.trustweave.trust.dsl.credential.KeyAlgorithmsimportorg.trustweave.credential.model.vc.VerifiableCredentialimportorg.trustweave.testkit.credential.InMemoryWalletimportorg.trustweave.testkit.services.*funmain()=runBlocking{// Create wallet using TrustWeave service API// Build TrustWeave instance (for tutorials, using testkit factories)valtrustWeave=TrustWeave.build{keys{provider(IN_MEMORY);algorithm(KeyAlgorithms.ED25519)}did{method(DidMethods.KEY){algorithm(KeyAlgorithms.ED25519)}}}valwallet=trustWeave.wallet{holder("did:key:holder")type("inMemory")}// Store credentialsvalcredential1=createCredential("Alice","alice@example.com")valcredential2=createCredential("Bob","bob@example.com")valid1=wallet.store(credential1)valid2=wallet.store(credential2)// Organize credentialsvalworkCollection=wallet.createCollection("Work Credentials")wallet.addToCollection(id1,workCollection)wallet.tagCredential(id1,setOf("important","verified"))// Query credentialsvalimportant=wallet.query{byIssuer("did:key:issuer")valid()}// Create presentationvalpresentation=wallet.createPresentation(credentialIds=listOf(id1),holderDid=wallet.holderDid,options=mapOf("holderDid"towallet.holderDid,"proofType"to"Ed25519Signature2020"))// Get statisticsvalstats=wallet.getStatistics()println("Wallet has ${stats.totalCredentials} credentials")}funcreateCredential(name:String,email:String):VerifiableCredential{returnVerifiableCredential(type=listOf("VerifiableCredential","PersonCredential"),issuer="did:key:issuer",credentialSubject=buildJsonObject{put("id","did:key:subject")put("name",name)put("email",email)},issuanceDate="2023-01-01T00:00:00Z")}
Best Practices
Use type-safe checks (wallet is CredentialOrganization) when possible
Organize credentials early using collections and tags
Query efficiently by combining filters
Use selective disclosure to minimize data exposure