UNPKG

l1-lottery-contracts

Version:

This repo contains smart contracts and related scripts for ZkNoid L1 Lottery proposed [here](https://forums.minaprotocol.com/t/zknoid-l1-lottery/6269)

59 lines 2 kB
import { Field, Struct, ZkProgram, SelfProof, } from 'o1js'; import { Ticket } from '../Structs/Ticket.js'; import { UInt64 } from 'o1js'; import { NumberPacked } from '../util.js'; import { MerkleMap20, MerkleMap20Witness } from '../Structs/CustomMerkleMap.js'; export class DistributionProofPublicInput extends Struct({ winningCombination: Field, ticket: Ticket, valueWitness: MerkleMap20Witness, }) { } export class DistributionProofPublicOutput extends Struct({ root: Field, total: UInt64, }) { } const emptyMap = new MerkleMap20(); const emptyMapRoot = emptyMap.getRoot(); // Initializer for proof export const init = async (input) => { return new DistributionProofPublicOutput({ root: emptyMapRoot, total: UInt64.from(0), }); }; export const addTicket = async (input, prevProof) => { prevProof.verify(); const [initialRoot, key] = input.valueWitness.computeRootAndKeyV2(Field(0)); initialRoot.assertEquals(prevProof.publicOutput.root); const newValue = input.ticket.hash(); const [newRoot] = input.valueWitness.computeRootAndKeyV2(newValue); const ticketScore = input.ticket.getScore(NumberPacked.unpack(input.winningCombination)); return new DistributionProofPublicOutput({ root: newRoot, total: prevProof.publicOutput.total.add(ticketScore), }); }; export const DistributionProgram = ZkProgram({ name: 'distribution-program', publicInput: DistributionProofPublicInput, publicOutput: DistributionProofPublicOutput, methods: { init: { privateInputs: [], async method(input) { return init(input); }, }, addTicket: { privateInputs: [SelfProof], async method(input, prevProof) { return addTicket(input, prevProof); }, }, }, }); export class DistributionProof extends ZkProgram.Proof(DistributionProgram) { } //# sourceMappingURL=DistributionProof.js.map