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
JavaScript
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