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)
132 lines • 5.31 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { AccountUpdate, Bool, Field, MerkleMap, MerkleMapWitness, PublicKey, SmartContract, State, state, Struct, Permissions, method, UInt32, } from 'o1js';
import { vkJSON } from '../vk.js';
import { BLOCK_PER_ROUND } from './constants.js';
import { MerkleMap20 } from './Structs/CustomMerkleMap.js';
import { NetworkIds } from './Network.js';
const emptyMerkleMapRoot = new MerkleMap().getRoot();
const networkId = process.env.NETWORK_ID || NetworkIds.MINA_DEVNET;
const vk = vkJSON[networkId];
const randomManagerVK = {
hash: Field(vk.randomManagerVK.hash),
data: vk.randomManagerVK.data,
};
const PLotteryVK = {
hash: Field(vk.PLotteryVK.hash),
data: vk.PLotteryVK.data,
};
export class DeployEvent extends Struct({
round: Field,
randomManager: PublicKey,
plottery: PublicKey,
}) {
}
///Just copy with other vk for random manager
export class PlotteryFactory extends SmartContract {
constructor() {
super(...arguments);
this.events = {
'deploy-plottery': DeployEvent,
};
this.roundsRoot = State();
this.startSlot = State();
}
init() {
super.init();
this.roundsRoot.set(emptyMerkleMapRoot);
this.network.globalSlotSinceGenesis.requireNothing();
this.startSlot.set(UInt32.from(671298));
// this.startSlot.set(this.network.globalSlotSinceGenesis.get());
}
async deployRound(witness, randomManager, plottery) {
// Check if round was not used and update merkle map
const curRoot = this.roundsRoot.getAndRequireEquals();
const [expectedRoot, round] = witness.computeRootAndKeyV2(Field(0));
curRoot.assertEquals(expectedRoot, 'Wrong witness');
const [newRoot] = witness.computeRootAndKeyV2(Field(1));
this.roundsRoot.set(newRoot);
const startSlot = this.startSlot.getAndRequireEquals();
const localStartSlot = startSlot.value.add(round.mul(BLOCK_PER_ROUND));
// Deploy and initialize random manager
{
const rmUpdate = AccountUpdate.createSigned(randomManager);
rmUpdate.account.verificationKey.set(randomManagerVK);
rmUpdate.update.appState[0] = {
isSome: Bool(true),
value: localStartSlot,
};
// Update permissions
rmUpdate.body.update.permissions = {
isSome: Bool(true),
value: {
...Permissions.default(),
},
};
}
// Deploy plottery
{
const plotteryUpdate = AccountUpdate.createSigned(plottery);
plotteryUpdate.account.verificationKey.set(PLotteryVK);
// Set random manager
const rmFields = randomManager.toFields();
// Random manager address
plotteryUpdate.update.appState[0] = {
isSome: Bool(true),
value: rmFields[0],
};
plotteryUpdate.update.appState[1] = {
isSome: Bool(true),
value: rmFields[1],
};
// Start slot set
plotteryUpdate.update.appState[2] = {
isSome: Bool(true),
value: localStartSlot,
};
// Set ticket ticketRoot
plotteryUpdate.update.appState[3] = {
isSome: Bool(true),
value: new MerkleMap20().getRoot(),
};
// Set ticket nullifier
plotteryUpdate.update.appState[4] = {
isSome: Bool(true),
value: new MerkleMap20().getRoot(),
};
// Update permissions
plotteryUpdate.body.update.permissions = {
isSome: Bool(true),
value: {
...Permissions.default(),
},
};
}
// Emit event
this.emitEvent('deploy-plottery', new DeployEvent({ round, plottery, randomManager }));
}
}
__decorate([
state(Field),
__metadata("design:type", Object)
], PlotteryFactory.prototype, "roundsRoot", void 0);
__decorate([
state(UInt32),
__metadata("design:type", Object)
], PlotteryFactory.prototype, "startSlot", void 0);
__decorate([
method,
__metadata("design:type", Function),
__metadata("design:paramtypes", [MerkleMapWitness,
PublicKey,
PublicKey]),
__metadata("design:returntype", Promise)
], PlotteryFactory.prototype, "deployRound", null);
//# sourceMappingURL=Factory.js.map