Solution: LP-0003 - Private Allowlist / Airdrop Distributor#44
Conversation
There was a problem hiding this comment.
Pull request overview
Adds a solution submission document for LP-0003 (DistributionX) under the repository’s solutions/ directory, describing the approach, evidence against success criteria, and supporting materials.
Changes:
- Introduces
solutions/LP-0003.mdwith a full submission write-up (summary, approach, checklist, FURPS). - Links to external repository artifacts (README, write-up, scripts, benchmarks) as supporting evidence.
- Includes Terms & Conditions acknowledgement section.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| # Solution: LP-0003 — DistributionX | ||
|
|
||
| ## Summary | ||
|
|
||
| DistributionX is a private allowlist airdrop for the Logos Execution Zone (LEZ). A distributor commits an encrypted eligibility list on-chain through a Merkle root, funds a vault, and lets eligible recipients claim with a real Risc0 proof using `RISC0_DEV_MODE=0`. |
|
|
||
| ## Repository | ||
|
|
||
| - Repository: [https://github.com/Timidan/dist-x](https://github.com/Timidan/dist-x) |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Added submitter information to the LP-0003 solution.
danisharora099
left a comment
There was a problem hiding this comment.
Thanks for the submission. I think this needs a few evidence and documentation updates before it can be treated as satisfying LP-0003.
Blocking
- LEZ devnet/testnet evidence is missing or ambiguous
LP-0003 requires deployment/testing and a working demo on LEZ devnet/testnet, including CU evidence where required. The evidence currently linked appears to demonstrate localhost/private-localnet/standalone execution, and the cited successful workflow skipped testnet-e2e.
Please provide pinned LEZ devnet/testnet run evidence, transaction/RPC logs, demo/video, and CU output, or revise the submission to state that this requirement is not yet satisfied.
- Outside-team distribution criterion is unresolved
LP-0003 still lists the requirement for 3 outside-team testnet distributions / 30 unique claims, but the submission says this was dropped or is out of scope.
Please either provide evidence satisfying this criterion or link an authoritative waiver/spec update from the prize maintainers.
Major / Required Clarifications
- CI status should be job-specific
The submission says CI is “All green”, but the referenced successful run did not execute testnet-e2e, and localnet E2E appears conditionally skippable when no sequencer is configured.
Please link a workflow run where the required E2E jobs actually executed, or qualify the CI claim to the specific jobs that ran.
- Private-input / public-transcript semantics need documentation
The solution shows the eligible address, salt, signature, and Merkle path are absent from the Risc0 journal. However, claim_private still accepts witness-like fields through the IDL/instruction interface.
Please document, with LEZ-specific evidence, whether those values are shielded/private inputs or otherwise absent from public transaction data/logs. I’m not claiming they leak, but the current submission does not make this independently verifiable.
- Bucket anonymity leakage should be explicit
Because bucket_id / amount-bucket information is public, unlinkability is bounded by the anonymity set within each bucket. Please document singleton/tiny-bucket leakage and how this is avoided, mitigated, or accepted in the privacy model.
Reproducibility / Documentation
- Pin implementation and evidence links
The solution links to Timidan/dist-x on master, which is mutable. Please pin implementation/evidence links to an immutable commit SHA, tag, or release, ideally the reviewed SHA 09712a17568fb58ff4fddc6b13dc1271fdca3982.
- Clarify the double-claim invariant
The implementation appears to enforce one claim per committed nullifier/row. Please document whether “each recipient can claim once” means once per committed row/nullifier or once per recipient/address, and what prevents duplicate recipient entries with distinct salts if address-level uniqueness is required.
- Document salt assumptions
Since nullifier unlinkability depends on salt secrecy and entropy, please document how salts are generated, distributed, stored, and kept secret as part of the threat/privacy model.
|
|
|
Thanks for the careful review. The L-Prize team's Discord instruction (quoted below) is to submit and highlight requirements I could not meet, so this comment answers each of your points and flags the ones I am acknowledging as unmet. Blocking 1 (LEZ devnet/testnet evidence) and Blocking 2 (outside-team distribution criterion) were both addressed by the L-Prize team on Discord, 08 May 2026 (message link):
Blocking 2 is dropped per the message. Blocking 1 and the privacy property under Major 2 below are the two outstanding requirements I am highlighting as not currently met; both are in solutions/LP-0003.md Requirements Not Met / Pending. Major 1 — CI status, qualifiedMy bad ,"All green" was too broad. The workflow at .github/workflows/distributionx-ci.yml (renamed from Major 2 — private input / public transcriptI think the documentation may have made an oversight here. Honest picture: the program has two claim instructions and the privacy property is not currently demonstrably met under either, for distinct reasons. Full reasoning and tracked follow-up in docs/WRITEUP.md Privacy Model. The The Naming. Tracked follow-up (this should independently restore the property):
The fix touches the program, the IDL mirrors, the generated FFI, and a fresh proof generation. Major 3 — bucket anonymity
Reproducibility 1 — pinned linksEvery Reproducibility 2 — double-claim invariantOn-chain enforcement is per nullifier, not per recipient. The nullifier is The committed Merkle leaf binds Reproducibility 3 — salt threat modelSalts are 32 bytes from Under the active Relayer visibility on the active path: receipt bytes, witness block ( The distributor knows every salt because it built the CSV; DistributionX protects observers from the eligibility set, not the distributor. Documented in WRITEUP Salt Threat Model. Happy to drill into any of these if I missed something. |
This has been fixed here Timidan/dist-x@9a590ba |

distributionx-exported.mp4