Introduction to AegisCare
๐ก๏ธ What is AegisCare?
AegisCare is a revolutionary clinical trial matching platform that uses Fully Homomorphic Encryption (FHE) to enable privacy-preserving patient-trial matching. Unlike traditional systems, AegisCare performs eligibility computations on encrypted data, ensuring zero plaintext leakage.
๐ Privacy Guarantee:
- Medical data never leaves the browser in plaintext
- Eligibility computed entirely in the encrypted domain
- Only the patient can decrypt their own results
- Trial sponsors never see patient medical data
โจ Key Features
- Client-Side Encryption: All medical data encrypted before submission
- FHE Operations: Computations on encrypted data only
- Private Decryption: EIP-712 signatures for secure access
- Zero Knowledge: Trial sponsors learn nothing about patient data
- Testnet Deployed: Live on Sepolia at
0x3DB49a1Ca0d72740e54f5FB06Ccc69576c4192F7
๐ Live Deployments โ Open in Explorer
AegisCare is already deployed. Inspect both contracts directly in their block explorers before you start.
๐ Complete User Guide
๐ New to AegisCare? Start Here!
Everything you need to know about privacy-preserving clinical trial matching
NEWComprehensive User Guide Available
We've created a complete, in-depth user guide to help you understand and use AegisCare. Whether you're a patient, trial sponsor, developer, or just curious about FHE technology, this guide has everything you need.
๐ Read Complete User Guide โWhat's Inside the User Guide
What is AegisCare?
Simple explanation of the platform and why it matters
Why Do We Need It?
Real-world problems AegisCare solves
How Does It Work?
Step-by-step process explanation with diagrams
Key Concepts Explained
FHE, EIP-712, ACLs made simple
Technology Stack
All technologies used and why
Getting Started Tutorial
5-minute quick start walkthrough
Perfect For:
๐ Key Highlights from the User Guide
๐ Privacy-First Architecture
Learn how AegisCare ensures your medical data never leaves your device in plaintext form. All data is encrypted using FHE before being sent to the blockchain, and only you can decrypt your eligibility results.
โก FHE Technology Explained
Understand Fully Homomorphic Encryption - how it allows computations on encrypted data without ever decrypting it. This breakthrough technology enables zero-knowledge trial matching.
๐ฏ Real-World Use Cases
Explore practical scenarios: diabetes trials, mental health studies, rare disease research. See how AegisCare solves real privacy concerns in clinical trial recruitment.
๐ Step-by-Step Tutorial
Follow our detailed 5-minute quick start guide. Learn how to connect your wallet, register as a patient, create trials, and check eligibility - all with privacy preserved.
๐ Comprehensive FAQ
Over 50 frequently asked questions answered. From "Can trial sponsors see my data?" to "How does FHE work?" - find answers to all your questions.
Ready to dive deeper into privacy-preserving clinical trials?
๐ Read the Complete User Guide โ500+ lines of comprehensive documentation โข 10 major sections โข Perfect for beginners
๐ Test Data Guide
Use these pre-configured test patients and trials to explore the platform without entering real medical data.
Quick Test Scenarios
โ Perfect Match
Patient: John (Age 45, Diabetes E11, BMI 28.5)
Trial: Diabetes Study (Age 18-65, E11, BMI 18.5-35)
Result: ELIGIBLE โ
โ Age Mismatch
Patient: Jane (Age 75, Diabetes E11, BMI 22.0)
Trial: Diabetes Study (Age 18-65, E11, BMI 18.5-35)
Result: NOT ELIGIBLE (too old)
โ ๏ธ Condition Mismatch
Patient: Bob (Age 50, No Condition, BMI 25.0)
Trial: Diabetes Study (Requires E11, Age 18-65)
Result: NOT ELIGIBLE (no diabetes)
โ Healthy Trial Match
Patient: Jane (Age 30, No Condition, BMI 22.0)
Trial: Wellness Study (Age 18-65, No Condition, BMI 18.5-30)
Result: ELIGIBLE โ
Sample Patient Data
Patient 1John Doe - Diabetes Patient
{
"name": "John Doe",
"age": 45,
"gender": 1,
"bmiScore": 28.5,
"hasMedicalCondition": true,
"conditionCode": "E11",
"description": "Type 2 Diabetes, age 45, BMI 28.5 (overweight)"
}Matches:
- โ Diabetes Treatment Study 2025
Patient 2Jane Smith - Healthy Adult
{
"name": "Jane Smith",
"age": 32,
"gender": 2,
"bmiScore": 22.1,
"hasMedicalCondition": false,
"conditionCode": "Z00",
"description": "Healthy adult, age 32, normal BMI"
}Matches:
- โ General Wellness Study
Patient 3Bob Johnson - Hypertension Patient
{
"name": "Bob Johnson",
"age": 58,
"gender": 1,
"bmiScore": 31.2,
"hasMedicalCondition": true,
"conditionCode": "I10",
"description": "Hypertension, age 58, BMI 31.2 (obese)"
}Matches:
- โ Cardiovascular Health Research
Sample Trial Data
Trial 1: Diabetes Treatment Study 2025
{
"trialName": "Diabetes Treatment Study 2025",
"description": "Testing new treatment for Type 2 diabetes in adults",
"criteria": {
"minAge": 18,
"maxAge": 65,
"requiredGender": 0,
"minBMIScore": 18.5,
"maxBMIScore": 35,
"hasSpecificCondition": true,
"conditionCode": "E11"
}
}๐ Eligible Patients:
- John Doe (Age 45, BMI 28.5, E11)
Trial 2: Cardiovascular Health Research
{
"trialName": "Cardiovascular Health Research",
"description": "Study on heart health in adults 40-70",
"criteria": {
"minAge": 40,
"maxAge": 70,
"requiredGender": 0,
"minBMIScore": 20,
"maxBMIScore": 40,
"hasSpecificCondition": true,
"conditionCode": "I10"
}
}๐ Eligible Patients:
- Bob Johnson (Age 58, BMI 31.2, I10)
Trial 3: General Wellness Study
{
"trialName": "General Wellness Study",
"description": "Open study for healthy adults",
"criteria": {
"minAge": 18,
"maxAge": 65,
"requiredGender": 0,
"minBMIScore": 18.5,
"maxBMIScore": 30,
"hasSpecificCondition": false,
"conditionCode": "Z00"
}
}๐ Eligible Patients:
- Jane Smith (Age 32, BMI 22.1, Z00)
- John Doe (if no diabetes - but he has E11, so no match)
Medical Codes Reference
| Code | Description | Category |
|---|---|---|
| E11 | Type 2 diabetes mellitus | Endocrine |
| E10 | Type 1 diabetes mellitus | Endocrine |
| I10 | Essential (primary) hypertension | Circulatory |
| I50 | Heart failure | Circulatory |
| J45 | Asthma | Respiratory |
| M54 | Dorsalgia (back pain) | Musculoskeletal |
| Z00 | General medical examination (healthy) | Health |
| Z01 | Special examinations and investigations | Health |
Gender Codes
| Code | Description |
|---|---|
| 0 | All genders (no preference) |
| 1 | Male |
| 2 | Female |
| 3 | Other / Prefer not to say |
๐ How It Works
Patient Workflow
Register Medical Data
Enter your medical information on the patient dashboard
Client-Side Encryption ๐
Your data is encrypted in the browser using FHE before being sent
Blockchain Registration
Encrypted data stored on Sepolia testnet via smart contract
Check Eligibility
Select a trial and trigger encrypted eligibility computation
Private Decryption ๐
Only YOU can decrypt your result with your private key
Trial Sponsor Workflow
Create Trial
Define trial name, description, and eligibility criteria
Encrypt Criteria ๐
Trial criteria encrypted before being sent to blockchain
Smart Contract Storage
Encrypted trial stored on Sepolia testnet
Wait for Patients
Patients can now check their eligibility against your trial
๐๏ธ Architecture Overview
System Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Patient Browser โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Medical Data (Plaintext) โ โ
โ โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ FHE Encryption (Client-Side) โ โ
โ โ โข Zama RelayerSDK v0.3.0-8 โ โ
โ โ โข Encrypted handles + proofs โ โ
โ โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Ethereum Sepolia Testnet โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ AegisCare Smart Contract โ โ
โ โ 0x3DB49...76c4192F7 โ โ
โ โ โ โ
โ โ โข Encrypted Patient Data โ โ
โ โ โข Encrypted Trial Criteria โ โ
โ โ โข FHE Eligibility Computation โ โ
โ โ โข Encrypted Results Storage โ โ
โ โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ EIP-712 Private Decryption โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Patient Signs EIP-712 Message โ โ
โ โ โ Private Key Decrypts Result โ โ
โ โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโ
โ ELIGIBLE โ
โ YES / NO โ
โโโโโโโโโโโ
โโ Parallel, anonymized AI advisor path โโ
โโโโโโโโโโโโโโโโ anonymized โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Browser โ โโโโโโโโโโโโโบ โ GenLayer StudioNet โ
โ (no PHI sent)โ buckets / โ AegisCareAdvisor (Python) โ
โ โ summary โ โข generate_explanation โ
โโโโโโโโโโโโโโโโ โ โข recommend_trials โ
โ โข validate_trial (ICD-10) โ
โ โข check_eligibility โ
โ leader โ validators โ store โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโKey Components:
- Frontend: Next.js 16, React 19, TypeScript, TailwindCSS 4
- FHE SDK: Zama RelayerSDK v0.3.0-8 for client-side encryption
- Web3: ethers.js v6, Wagmi for wallet connection
- Blockchain: Solidity 0.8.27, fhEVM, Sepolia testnet
- AI Advisor: GenLayer AegisCareAdvisor (Python) on StudioNet โ LLM consensus, ICD-10 web validation, PII screening
- Smart Contract: AegisCare.sol with FHE operations
๐ง GenLayer AI Advisor
AegisCareAdvisor is a Python Intelligent Contract on GenLayer that adds an AI reasoning layer on top of the FHE matching engine. It explains results, recommends trials, validates registrations, and checks external-registry eligibility โ all settled on-chain through Optimistic Democracy consensus.
๐ฏ The core idea
FHE is great at deterministic, confidential math, but it cannot explain a result, recommend a trial from free text, or validate a registration against a live medical reference. Those need judgment โ so they run on GenLayer, on anonymized inputs only, with leader/validator consensus so the result is trustless.
What is GenLayer?
GenLayer is an AI-native blockchain. Its smart contracts โ Intelligent Contracts, written in Python โ can natively call LLMs and read the live web from inside contract execution. Because that output is non-deterministic, GenLayer settles it with Optimistic Democracy consensus: a randomly chosen leader proposes a result, independent validators re-run the same logic, and the value commits only when validators agree on its meaning โ not on exact bytes. The result is AI reasoning that is trustless and verifiable on-chain, with no centralized oracle and no single model deciding the outcome.
๐ค LLM in the contract
gl.nondet.exec_prompt() runs a model as a first-class on-chain operation.
๐ Live web access
gl.nondet.web.render() reads real sources (e.g. WHO ICD-10) at execution time.
โ๏ธ Consensus on meaning
Validators agree the result is equivalent, so non-deterministic output still settles deterministically.
How GenLayer Contributes & the Problems It Solves
FHE makes the eligibility decision private and correct, but a raw boolean isn't enough for real users. GenLayer adds the reasoning layer FHE cannot โ and does it without ever weakening the privacy guarantee. Each row below is a concrete gap the advisor closes.
| Problem | Why FHE alone can't | GenLayer's contribution |
|---|---|---|
| "Why am I (not) eligible?" | FHE returns a 1/0 โ it can't produce natural language. | generate_explanation turns the result into a plain-language reason, validated to never leak patient values. |
| Finding the right trial among many | Ranking free-text trial descriptions needs semantic judgment, not arithmetic. | recommend_trials picks 1โ3 best matches from an anonymized profile, with validators bounding the picks to the candidate set. |
| Garbage / fake trial data | A contract can't tell if an ICD-10 code is real or a description is coherent. | validate_trial fetches live WHO ICD-10 data on-chain and validates the registration before it's trusted. |
| Eligibility for off-chain trials | Real trials live on external registries the FHE contract never sees. | check_eligibility reads a registry URL and assesses a PII-screened summary against it. |
| Trusting an AI answer | A normal LLM/oracle is a centralized black box โ one model, no recourse. | Leader + validator consensus means every AI result is independently re-derived and agreed before it's stored. |
The division of labor: Zama fhEVM keeps medical data private and computes the decision under encryption; GenLayer makes the AI reasoning on top of that decision trustless. Neither layer ever sees the other's secrets โ the advisor receives only anonymized, de-identified inputs.
Advisor Capabilities
1. Eligibility explainer ยท generate_explanation
Turns the binary FHE eligibility result into a plain-language explanation for the patient. The validator enforces the explanation names the correct status, references a criterion boundary, stays within 50โ400 characters, and never echoes specific patient values.
2. Trial recommender ยท recommend_trials
Suggests the best 1โ3 trials from a candidate list using an anonymized profile (age bucket + condition category + profile hash). The validator confirms the picked IDs are within the candidate set and the count is valid.
3. Trial validator ยท validate_trial
Fetches the live WHO ICD-10 reference on-chain via GenLayer's web access and checks that a trial registration is coherent and its condition code is real. The validator re-runs the leader and agrees only on the boolean outcome.
4. Registry eligibility checker ยท check_eligibility
Assesses eligibility against an external trial-registry URL from a PII-screened anonymized summary. Returns ELIGIBLE / NOT_ELIGIBLE / UNCLEAR with matched and failed criteria. The validator agrees on the verdict class.
Consensus & Equivalence
Every write method follows the same pattern โ a leader proposes, validators independently evaluate, and only equivalent results settle. Because LLM and web output are non-deterministic, validators agree on meaning, not exact bytes.
leader_fn()
โ calls gl.nondet.exec_prompt() / gl.nondet.web.render()
โ parses + validates JSON defensively (prefix: LLM_ERROR / EXPECTED)
โ returns structured calldata
validator_fn(leaders_res)
โ re-runs leader_fn() independently
โ checks leaders_res is gl.vm.Return
โ compares on the DECIDED field (status / verdict / boolean)
โ True โ accept
โ False โ reject
gl.vm.run_nondet_unsafe(leader_fn, validator_fn)
โ only an accepted result is written to contract storageโ Equivalence on meaning
Two validators may phrase an explanation differently, but they agree it conveys the right status โ so the result is trustworthy.
๐ก๏ธ Defensive LLM handling
JSON is parsed defensively; malformed output, wrong types, and missing fields are classified with deterministic prefixes so failures are reproducible, not silent.
Privacy Boundary
The advisor is strictly additive and isolated. It never receives raw or encrypted patient medical data โ only anonymized, de-identified inputs.
| Input | Form |
|---|---|
| Patient age | Coarse bucket (e.g. "30-40") |
| Condition | Category code, not free-text history |
| Patient summary | Pre-screened, length-bounded (20โ2000 chars), regex-checked for email / phone / ID runs |
| Eligibility | A boolean computed under FHE, not the raw values |
Enforced twice. The same PII/length rules run client-side in lib/genLayerClient.ts (fast failure) and again in the contract (authoritative). Unsafe input never reaches consensus.
Advisor Contract API
GenVM dispatch uses snake_case methods with kwargs. Names mirror the deployed schema in config/genLayerContracts.ts.
| Method | Type | Returns |
|---|---|---|
| generate_explanation | write | stores explanation keyed by trial + patient |
| get_explanation | view | str |
| recommend_trials | write | stores trial_ids + reasoning keyed by profile hash |
| get_recommendations | view | Recommendation |
| validate_trial | write | stores ValidationResult keyed by trial |
| get_validation | view | ValidationResult |
| check_eligibility | write | stores EligibilityCheck keyed by check_id |
| get_eligibility_check | view | EligibilityCheck |
Stored data structures
View methods return these dataclasses from contract storage. List-valued fields are stored as JSON strings โ decode them client-side with parseCriteria().
@dataclass
class ValidationResult: # get_validation(trial_id)
valid: bool # true only if coherent AND real ICD-10 code
reason: str # required when valid=false
suggestions: str # JSON-encoded list[str]
@dataclass
class Recommendation: # get_recommendations(profile_hash)
trial_ids: str # JSON-encoded list[int], 1-3 picks
reasoning: str
@dataclass
class EligibilityCheck: # get_eligibility_check(check_id)
trial_registry_url: str
anonymized_summary: str # 20-2000 chars, PII-screened
result: str # 'ELIGIBLE' | 'NOT_ELIGIBLE' | 'UNCLEAR'
reasoning: str
matched_criteria: str # JSON-encoded list[str]
failed_criteria: str # JSON-encoded list[str]
# Storage layout (on-chain TreeMaps):
# explanations: u32 trial_id -> (str patient_address -> str)
# recommendations: str profile_hash -> Recommendation
# validations: u32 trial_id -> ValidationResult
# eligibility_checks: str check_id -> EligibilityCheckOn-chain web sources
Web reads run inside the leader via gl.nondet.web.render(url, mode="text") and are length-bounded so the prompt stays deterministic across validators.
| Method | Source | Cap |
|---|---|---|
| validate_trial | WHO ICD-10 ยท icd.who.int/browse10 | 3,000 chars |
| check_eligibility | Caller-supplied trial-registry URL | 5,000 chars |
Write: generate an explanation
import { generateExplanation } from '@/lib/genLayerClient';
await generateExplanation({
trialId: 1,
patientAddress: '0x...',
isEligible: true, // computed under FHE by AegisCare.sol
trialName: 'Diabetes Treatment Study 2025',
minAge: 18, maxAge: 65,
conditionCode: 'E11',
minBmi: '18.5', maxBmi: '35',
});Read: fetch the stored eligibility check
import { getEligibilityCheck, parseCriteria } from '@/lib/genLayerClient';
const check = await getEligibilityCheck('check-001');
// check.result -> 'ELIGIBLE' | 'NOT_ELIGIBLE' | 'UNCLEAR'
// parseCriteria(check.matched_criteria) -> string[]
// parseCriteria(check.failed_criteria) -> string[]Deploying the Advisor
The advisor is deployed independently on GenLayer StudioNet (gasless). Lint before deploy, then wire the returned address into the frontend.
# 1. Lint the Intelligent Contract (fix errors first)
genvm-lint check contracts/aegiscare_advisor.py --json
# 2. Deploy on GenLayer StudioNet
genlayer deploy --contract contracts/aegiscare_advisor.py
# 3. Inspect the deployed schema
genlayer schema <advisor-address>
# 4. Put the address into .env
NEXT_PUBLIC_ADVISOR_ADDRESS=0x...
NEXT_PUBLIC_GENLAYER_CHAIN_ID=studionetCurrent deployment: 0x7feFc3d155c5c268E3e104e6620d71C0A4ebe4e3 on GenLayer StudioNet. The frontend guards against a missing address (assertAdvisorConfigured), so a misconfigured deploy fails loudly instead of sending transactions to address(0).
๐ API Reference
FHE Client API
Client-side encryption utilities in lib/fheClient.ts
Encrypt Patient Data
import { encryptPatientData } from '@/lib/fheClient';
const encryptedData = await encryptPatientData({
age: 45,
gender: 1, // 1=male, 2=female, 3=other
bmiScore: 28.5,
hasMedicalCondition: true,
conditionCode: "E11" // ICD-10 code
});
// Returns:
// {
// age: { handle: "0x...", ... },
// ageProof: "0x...",
// gender: { handle: "0x...", ... },
// genderProof: "0x...",
// ...
// }Encrypt Trial Criteria
import { encryptTrialCriteria } from '@/lib/fheClient';
const encryptedCriteria = await encryptTrialCriteria({
trialName: "Diabetes Study 2025",
description: "Testing new treatment",
minAge: 18,
maxAge: 65,
requiredGender: 0,
minBMIScore: 18.5,
maxBMIScore: 35,
hasSpecificCondition: true,
conditionCode: "E11"
});Decrypt Eligibility Result
import { decryptEligibilityResult } from '@/lib/fheClient';
const isEligible = await decryptEligibilityResult(
encryptedResult,
contractAddress,
signer
);
console.log(isEligible); // true or falseWeb3 Client API
Blockchain interaction utilities in lib/web3Client.ts
Register Patient
import { registerPatient } from '@/lib/web3Client';
await registerPatient(signer, encryptedData, publicKeyHash);Register Trial
import { registerTrial } from '@/lib/web3Client';
await registerTrial(
signer,
trialName,
description,
encryptedCriteria
);Compute Eligibility
import { computeEligibility } from '@/lib/web3Client';
await computeEligibility(signer, trialId, patientAddress);Smart Contract API
Contract deployed at 0x3DB49a1Ca0d72740e54f5FB06Ccc69576c4192F7 on Sepolia
registerPatient
Register a patient with encrypted medical data
function registerPatient(
bytes32 ageHandle,
bytes32 ageProof,
bytes32 genderHandle,
bytes32 genderProof,
bytes32 bmiScoreHandle,
bytes32 bmiProof,
bytes32 hasMedicalConditionHandle,
bytes32 conditionProof,
bytes32 conditionCodeHandle,
bytes32 codeProof,
bytes32 publicKeyHash
) externalregisterTrial
Create a new clinical trial (owner only)
function registerTrial(
string memory trialName,
string memory description,
bytes32 minAgeHandle,
bytes32 minAgeProof,
// ... (14 more encrypted parameters)
) external onlyOwnercomputeEligibility
Compute eligibility on encrypted data
function computeEligibility(
uint256 _trialId,
address _patientAddress
) externalgetEligibilityResult
Get encrypted result (patient only)
function getEligibilityResult(
uint256 _trialId,
address _patientAddress
) external view returns (bytes32)๐ Troubleshooting
Common Issues
"Cannot connect to wallet"
Ensure MetaMask is installed and you're on Sepolia testnet
Solution: Refresh page, check MetaMask, verify network
"Transaction failed"
Not enough ETH for gas fees
Solution: Get free Sepolia ETH from sepoliafaucet.com
"FHE initialization failed"
Zama FHE SDK still loading
Solution: Wait 5-10 seconds, check internet connection, refresh page
"Eligibility computation failed"
Patient or trial not registered
Solution: Ensure you're registered and the trial exists
"Cannot decrypt result"
Only patients can decrypt their own results
Solution: Use the correct wallet address, sign EIP-712 message
๐ Security & Privacy
Privacy Guarantees
- โ Zero Knowledge: Trial sponsors learn NOTHING about patient data
- โ Encrypted Computation: All operations on encrypted data
- โ Private Decryption: Only patients can decrypt their results
- โ No Plaintext Storage: Only encrypted data on-chain
- โ Pausable Contract: Emergency stop functionality
Compliance:
- HIPAA Compliant: No PHI disclosure without patient consent
- GDPR Compliant: Data protection by design and default
- Regulatory Friendly: Privacy-first architecture
๐ข Deployment
Current Deployment
Network: Sepolia Testnet
Contract: 0x3DB49a1Ca0d72740e54f5FB06Ccc69576c4192F7
Chain ID: 11155111
View on Etherscan: sepolia.etherscan.io
Local Deployment
# Deploy to local network
npm run deploy:local
# Deploy to Sepolia
npm run deploy:sepolia
# Run tests
npm test
# Compile contracts
npx hardhat compileBuilt with โค๏ธ using Zama FHEVM
Privacy-Preserving Clinical Trial Matching