export ledger { total_salary_sum: Uint64, employee_count: Uint64
};
export ledger { total_salary_sum: Uint64, employee_count: Uint64
};
export ledger { total_salary_sum: Uint64, employee_count: Uint64
};
export circuit submit_salary(salary: Uint64): [] { const current_sum = ledger.total_salary_sum; const current_count = ledger.employee_count; ledger.total_salary_sum = current_sum + salary; ledger.employee_count = current_count + 1;
}
export circuit submit_salary(salary: Uint64): [] { const current_sum = ledger.total_salary_sum; const current_count = ledger.employee_count; ledger.total_salary_sum = current_sum + salary; ledger.employee_count = current_count + 1;
}
export circuit submit_salary(salary: Uint64): [] { const current_sum = ledger.total_salary_sum; const current_count = ledger.employee_count; ledger.total_salary_sum = current_sum + salary; ledger.employee_count = current_count + 1;
}
export circuit is_above_benchmark(my_salary: Uint64): Boolean { const count = ledger.employee_count; const total = ledger.total_salary_sum; // The Privacy Gate: Revert if less than 5 people have joined check(count >= 5) "Threshold Error: N < 5 contributors"; const average = total / count; return my_salary > average;
}
export circuit is_above_benchmark(my_salary: Uint64): Boolean { const count = ledger.employee_count; const total = ledger.total_salary_sum; // The Privacy Gate: Revert if less than 5 people have joined check(count >= 5) "Threshold Error: N < 5 contributors"; const average = total / count; return my_salary > average;
}
export circuit is_above_benchmark(my_salary: Uint64): Boolean { const count = ledger.employee_count; const total = ledger.total_salary_sum; // The Privacy Gate: Revert if less than 5 people have joined check(count >= 5) "Threshold Error: N < 5 contributors"; const average = total / count; return my_salary > average;
}
compact compile ./contracts/salary.compact
compact compile ./contracts/salary.compact
compact compile ./contracts/salary.compact
midnight-sdk-gen ./contracts/salary.structure.json --output ./src/sdk/SalarySDK.ts
midnight-sdk-gen ./contracts/salary.structure.json --output ./src/sdk/SalarySDK.ts
midnight-sdk-gen ./contracts/salary.structure.json --output ./src/sdk/SalarySDK.ts
const env = process.env.MIDNIGHT_ENV || "simulated";
const providers = await getProviders(env);
const env = process.env.MIDNIGHT_ENV || "simulated";
const providers = await getProviders(env);
const env = process.env.MIDNIGHT_ENV || "simulated";
const providers = await getProviders(env);
import { SalarySDK } from "./sdk/SalarySDK"; const sdk = await SalarySDK.deploy(providers);
const contractAddress = sdk.handle.address;
import { SalarySDK } from "./sdk/SalarySDK"; const sdk = await SalarySDK.deploy(providers);
const contractAddress = sdk.handle.address;
import { SalarySDK } from "./sdk/SalarySDK"; const sdk = await SalarySDK.deploy(providers);
const contractAddress = sdk.handle.address;
for (const agent of agents) { // Join the same shared contract address using the generated SDK const agentSdk = await SalarySDK.join(contractAddress, agent.providers); // Submit salary privately via the ZK circuit // The SDK handles all witness and proof management await agentSdk.submit_salary(agent.witness); // Log progress using side-by-side observability const publicState = await agentSdk.providers.publicDataProvider.queryContractState( contractAddress, ); StateObserver.displayPulse(agent, publicState);
}
for (const agent of agents) { // Join the same shared contract address using the generated SDK const agentSdk = await SalarySDK.join(contractAddress, agent.providers); // Submit salary privately via the ZK circuit // The SDK handles all witness and proof management await agentSdk.submit_salary(agent.witness); // Log progress using side-by-side observability const publicState = await agentSdk.providers.publicDataProvider.queryContractState( contractAddress, ); StateObserver.displayPulse(agent, publicState);
}
for (const agent of agents) { // Join the same shared contract address using the generated SDK const agentSdk = await SalarySDK.join(contractAddress, agent.providers); // Submit salary privately via the ZK circuit // The SDK handles all witness and proof management await agentSdk.submit_salary(agent.witness); // Log progress using side-by-side observability const publicState = await agentSdk.providers.publicDataProvider.queryContractState( contractAddress, ); StateObserver.displayPulse(agent, publicState);
}
const isAbove = await carolSdk.is_above_benchmark(carol.witness);
StateObserver.displayResult("Carol", isAbove);
const isAbove = await carolSdk.is_above_benchmark(carol.witness);
StateObserver.displayResult("Carol", isAbove);
const isAbove = await carolSdk.is_above_benchmark(carol.witness);
StateObserver.displayResult("Carol", isAbove);
--- [Alice] Status --- ┌──────────────────────────────┬──────────────────────────────┐ │ PUBLIC STATE │ PRIVATE STATE │ ├──────────────────────────────┼──────────────────────────────┤ │ Total Sum: 92,000 │ My Salary: 92,000 │ │ Headcount: 1 │ ZK-Proof: VALID │ └──────────────────────────────┴──────────────────────────────┘
--- [Alice] Status --- ┌──────────────────────────────┬──────────────────────────────┐ │ PUBLIC STATE │ PRIVATE STATE │ ├──────────────────────────────┼──────────────────────────────┤ │ Total Sum: 92,000 │ My Salary: 92,000 │ │ Headcount: 1 │ ZK-Proof: VALID │ └──────────────────────────────┴──────────────────────────────┘
--- [Alice] Status --- ┌──────────────────────────────┬──────────────────────────────┐ │ PUBLIC STATE │ PRIVATE STATE │ ├──────────────────────────────┼──────────────────────────────┤ │ Total Sum: 92,000 │ My Salary: 92,000 │ │ Headcount: 1 │ ZK-Proof: VALID │ └──────────────────────────────┴──────────────────────────────┘
git clone https://github.com/Kanasjnr/midnight-pulse-sdk-demo
cd midnight-pulse-sdk-demo
npm install && make run
git clone https://github.com/Kanasjnr/midnight-pulse-sdk-demo
cd midnight-pulse-sdk-demo
npm install && make run
git clone https://github.com/Kanasjnr/midnight-pulse-sdk-demo
cd midnight-pulse-sdk-demo
npm install && make run - Error-prone: Manual type mapping can lead to runtime failures.
- Maintenance-heavy: Every contract change requires a manual update to the SDK.
- Boilerplate-intensive: Setting up contract stubs and providers involves repetitive code. - Zero Maintenance: Changing your contract automatically updates your SDK types.
- Type Safety: No more runtime errors from incorrect type mapping.
- Developer Velocity: Focus on your dApp logic, not the cryptographic plumbing.