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.
✅ Validation passedA reviewer will assess against the prize criteria. Automated check. See solution template and TERMS. |
|
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 |
|
Thank you for the response. Let me take another look and get back to you on this. |
|
Hi @Timidan per our rules, we do not allow changes to an existing submission and instead favour the reject and resubmit path. Therefore, we are closing this and you are welcome to resubmit with the changes adopted. |
|
@mart1n-xyz would i need to re-record the video in the next pr? the changes only slighty affected documentation and no serious architectural processes |

distributionx-exported.mp4