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)

134 lines 5 kB
import { Field } from 'o1js'; // import { dummyBase64Proof } from 'o1js/dist/node/lib/proof-system/zkprogram'; // import { Pickles } from 'o1js/dist/node/snarky'; import { MerkleMap20 } from '../Structs/CustomMerkleMap.js'; export async function mockProof(publicOutput, ProofType, publicInput) { // const [, proof] = Pickles.proofOfBase64(await dummyBase64Proof(), 2); return new ProofType({ proof: null, maxProofsVerified: 2, publicInput, publicOutput, }); } export class BaseStateManager { constructor(contract, isMock = true, shouldUpdateState = false) { this.contract = contract; this.ticketMap = new MerkleMap20(); this.lastTicketInRound = 0; this.roundTickets = []; this.ticketNullifierMap = new MerkleMap20(); this.isMock = isMock; this.shouldUpdateState = shouldUpdateState; } addTicket(ticket) { throw Error('Add ticket is not implemented'); } // async getDP(round: number): Promise<DistributionProof> { // if (this.dpProof) { // return this.dpProof; // } // const reducedTickets = (await this.contract.reducer.fetchActions()).flat(1); // const winningCombination = this.contract.result.get(); // let curMap = new MerkleMap20(); // let input = new DistributionProofPublicInput({ // winningCombination, // ticket: Ticket.random(PublicKey.empty()), // valueWitness: this.ticketMap.getWitness(Field(0)), // }); // let curProof = this.isMock // ? await mockProof(await init(input), DistributionProof, input) // : await DistributionProgram.init(input); // for (let i = 0; i < reducedTickets.length; i++) { // const ticket = reducedTickets[i].ticket; // if (!ticket) { // // Skip refunded tickets // continue; // } // const input = new DistributionProofPublicInput({ // winningCombination, // ticket: ticket, // valueWitness: curMap.getWitness(Field(i)), // }); // curMap.set(Field(i), ticket.hash()); // if (this.isMock) { // curProof = await mockProof( // await addTicket(input, curProof), // DistributionProof, // input // ); // } else { // curProof = await DistributionProgram.addTicket(input, curProof); // } // } // this.dpProof = curProof; // return curProof; // } // Changes value of nullifier! async getReward(round, ticket, roundDP = undefined, ticketIndex = 1 // If two or more same tickets presented ) { const ticketHash = ticket.hash(); let ticketWitness; // Find ticket in tree let ticketId = 0; for (; ticketId < this.lastTicketInRound; ticketId++) { if (this.ticketMap.get(Field(ticketId)).equals(ticketHash).toBoolean()) { ticketIndex--; if (ticketIndex == 0) { ticketWitness = this.ticketMap.getWitness(Field.from(ticketId)); break; } } } if (!ticketWitness) { throw Error(`No such ticket in round ${round}`); } // const dp = !roundDP // ? await this.getDP(round) // : await DistributionProof.fromJSON(roundDP); const nullifierWitness = this.ticketNullifierMap.getWitness(Field.from(ticketId)); if (this.shouldUpdateState) { this.ticketNullifierMap.set(Field.from(ticketId), Field(1)); } return { ticketWitness, // dp, nullifierWitness, }; } async getRewardByTicketId(ticketId) { const ticketWitness = this.ticketMap.getWitness(Field.from(ticketId)); const nullifierWitness = this.ticketNullifierMap.getWitness(Field.from(ticketId)); if (this.shouldUpdateState) { this.ticketNullifierMap.set(Field.from(ticketId), Field(1)); } return { ticketWitness, nullifierWitness, }; } async getRefund(round, ticket) { const ticketHash = ticket.hash(); let ticketWitness; // Find ticket in tree let ticketId = 0; for (; ticketId < this.lastTicketInRound; ticketId++) { if (this.ticketMap.get(Field(ticketId)).equals(ticketHash).toBoolean()) { ticketWitness = this.ticketMap.getWitness(Field.from(ticketId)); break; } } if (!ticketWitness) { throw Error(`No such ticket in round ${round}`); } if (this.shouldUpdateState) { console.log('Update state'); this.ticketMap.set(Field(ticketId), Field(0)); this.roundTickets[ticketId] = undefined; } return { ticketWitness, }; } } //# sourceMappingURL=BaseStateManager.js.map