Building Parametric Insurance with TrustWeave Smart Contracts
This guide demonstrates how to build a parametric insurance system using TrustWeave’s Smart Contract abstraction. You’ll learn how to create contracts that automatically execute based on Earth Observation (EO) data triggers, with verifiable credentials and blockchain anchoring for trust and auditability.
What You’ll Build
By the end of this tutorial, you’ll have:
Created a parametric insurance contract using SmartContract
Bound the contract with verifiable credentials
Anchored the contract to blockchain
Executed the contract based on EO data triggers
Generated automatic payouts when conditions are met
importorg.trustweave.trust.TrustWeaveimportorg.trustweave.trust.dsl.credential.DidMethods.KEYimportorg.trustweave.trust.dsl.credential.KeyAlgorithms.ED25519importorg.trustweave.contract.models.*importorg.trustweave.core.json.jsonDataimportkotlinx.serialization.json.putimportjava.time.InstantvaltrustWeave=TrustWeave.build{did{method(KEY){algorithm(ED25519)}}anchor{chain("algorand:mainnet"){provider("algorand")options{/* configure from your Algorand client / environment */}}}}valinsurerDid=trustWeave.createDid{method(KEY);algorithm(ED25519)}valinsuredDid=trustWeave.createDid{method(KEY);algorithm(ED25519)}valeoProviderDid=trustWeave.createDid{method(KEY);algorithm(ED25519)}
importorg.trustweave.trust.types.getOrThrowDidimportorg.trustweave.trust.types.getOrThrowimportorg.trustweave.did.resolver.DidResolutionResultimportorg.trustweave.did.resolver.errorMessageimportorg.trustweave.did.identifiers.extractKeyIdimportorg.trustweave.credential.results.IssuanceResultimportorg.trustweave.trust.dsl.credential.KeyAlgorithms.ED25519importorg.trustweave.trust.dsl.credential.DidMethods.KEYimportorg.trustweave.credential.results.getOrThrowsuspendfuncompleteParametricInsuranceWorkflow(){valtrustWeave=TrustWeave.build{did{method(KEY){algorithm(ED25519)}}anchor{chain("algorand:mainnet"){provider("algorand")options{/* configure from your Algorand client / environment */}}}}// Step 1: Create DIDsvalinsurerDid=trustWeave.createDid{method(KEY)}.getOrThrowDid()valinsuredDid=trustWeave.createDid{method(KEY)}.getOrThrowDid()valeoProviderDid=trustWeave.createDid{method(KEY)}.getOrThrowDid()valinsurerDoc=when(valres=trustWeave.resolveDid(insurerDid)){isDidResolutionResult.Success->res.documentelse->throwIllegalStateException(res.errorMessage?:"Failed to resolve DID")}valinsurerKeyId=insurerDoc.verificationMethod.firstOrNull()?.extractKeyId()?:throwIllegalStateException("No key found")valeoProviderDoc=when(valres=trustWeave.resolveDid(eoProviderDid)){isDidResolutionResult.Success->res.documentelse->throwIllegalStateException(res.errorMessage?:"Failed to resolve DID")}valeoProviderKeyId=eoProviderDoc.verificationMethod.firstOrNull()?.extractKeyId()?:throwIllegalStateException("No key found")// Step 2: Create contract draftvalcontract=createFloodInsuranceContract(TrustWeave=trustWeave,insurerDid=insurerDid.value,insuredDid=insuredDid.value,coverageAmount=1_000_000.0,location=Location(latitude=35.2271,longitude=-80.8431,address="Charlotte, NC",region="North Carolina"))// Step 3: Bind contractvalbound=bindInsuranceContract(TrustWeave=trustWeave,contract=contract,insurerDid=insurerDid.value,insurerKeyId=insurerKeyId)// Step 4: Activate contractvalactive=activateContract(trustWeave,bound.contract.id)// Step 5: Simulate flood event// In production, this would come from EO data providervalfloodDepth=75.0// cm// Issue EO data credential (simplified - in production, EO provider issues this)valeoDataIssuanceResult=trustWeave.issue{credential{type("EarthObservationCredential")issuer(eoProviderDid)subject{"floodDepthCm"tofloodDepth"timestamp"toInstant.now().toString()}issued(Instant.now())}signedBy(eoProviderDid)}valeoDataCredential=eoDataIssuanceResult.getOrThrow()// Step 6: Execute contractvalexecutionResult=processFloodDataAndExecute(TrustWeave=TrustWeave,contract=active,floodDepthCm=floodDepth,eoDataCredential=eoDataCredential)// Step 7: Process payout (application-specific)if(executionResult.executed){processPayout(executionResult)}}
Advanced: Custom Condition Evaluation
For production use, implement custom condition evaluators:
classFloodConditionEvaluator:ConditionEvaluator{overridesuspendfunevaluate(condition:ContractCondition,inputData:JsonElement,contract:SmartContract):Boolean{when(condition.conditionType){ConditionType.THRESHOLD->{valthreshold=extractThreshold(condition.expression)valvalue=extractValue(inputData,"floodDepthCm")returnvalue>=threshold}else->throwUnsupportedOperationException("Condition type ${condition.conditionType} not supported")}}privatefunextractThreshold(expression:String):Double{// Parse expression like "$.floodDepthCm >= 50"valmatch=Regex(">= (\\d+\\.?\\d*)").find(expression)returnmatch?.groupValues?.get(1)?.toDouble()?:0.0}privatefunextractValue(data:JsonElement,key:String):Double{returndata.jsonObject[key]?.jsonPrimitive?.content?.toDouble()?:0.0}}
Benefits of Using Smart Contracts
Standardization: W3C-compliant format works across all contract types
Trust: Cryptographic proof of contract terms prevents disputes