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)
131 lines (113 loc) • 3.65 kB
text/typescript
import mongoose, { Schema, Document, Model } from 'mongoose';
import dotenv from 'dotenv';
import fs from 'fs';
// Load environment variables from .env file
dotenv.config();
/**
* 1. Define a plain TypeScript interface representing the data structure.
*/
interface IGiftCode {
userAddress: string;
transactionHash: string;
code: string;
used: boolean;
deleted: boolean;
buyTxHash: string;
}
/**
* 2. Extend the IGiftCode interface with Mongoose's Document interface.
*/
interface IGiftCodeDocument extends IGiftCode, Document {}
/**
* 3. Define the schema corresponding to the IGiftCode interface.
*/
const GiftCodeSchema: Schema<IGiftCodeDocument> = new Schema({
userAddress: { type: String, required: true },
transactionHash: { type: String, required: true },
code: { type: String, required: true },
used: { type: Boolean, required: true, default: false },
deleted: { type: Boolean, required: true, default: false },
buyTxHash: { type: String, required: true },
});
/**
* 4. Create a Mongoose model from the schema.
*/
const GiftCode: Model<IGiftCodeDocument> = mongoose.model<IGiftCodeDocument>(
'gift-codes',
GiftCodeSchema
);
/**
* Utility function to generate a random hexadecimal string of a given length.
* @param length Length of the hexadecimal string
*/
function generateRandomHex(length: number): string {
let result = '';
const characters = 'abcdef0123456789';
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * characters.length));
}
return result;
}
async function main() {
// Parse command-line arguments
const countArg = process.argv[2];
const fileArg = process.argv[3];
if (!countArg || !fileArg) {
console.error('Usage: node script.js <number_of_codes> <output_filename>');
process.exit(1);
}
const count = parseInt(countArg, 10);
if (isNaN(count) || count <= 0) {
console.error('Invalid number of codes specified.');
process.exit(1);
}
const filename = fileArg;
if (fs.existsSync(filename)) {
throw new Error(`File "${filename}" already exists.`);
}
const mongoUri = process.env.MONGODB_URI;
if (!mongoUri) {
console.error('MongoDB URI not specified in environment variables.');
process.exit(1);
}
try {
console.log(mongoUri);
// Connect to the MongoDB database
await mongoose.connect(mongoUri);
console.log('Connected to MongoDB');
// Define an array of IGiftCode objects (plain data)
const giftCodes: IGiftCode[] = [];
// Generate an array of random gift codes
for (let i = 0; i < count; i++) {
giftCodes.push({
userAddress: 'SCRIPT_GENERATED_CODE', // Random Ethereum-like address
transactionHash: 'SCRIPT_GENERATED_CODE', // Random transaction hash
code: generateRandomHex(16), // Random gift code
used: false,
deleted: false,
buyTxHash: 'SCRIPT_GENERATED_CODE', // Random purchase transaction hash
});
}
// Write generated codes to the specified file
fs.writeFileSync(
filename,
JSON.stringify(
giftCodes.map((info) => info.code),
null,
2
)
);
console.log(`Generated codes written to file: ${filename}`);
// Insert generated gift codes into the database
await GiftCode.insertMany(giftCodes);
console.log(`${count} gift codes inserted into the database.`);
} catch (error) {
console.error('Error:', error);
} finally {
// Close the connection after operation
await mongoose.disconnect();
console.log('Disconnected from MongoDB');
}
}
// Run the main function
main();