import bs58 from "bs58";
import hre from "hardhat";
const BACKEND_PORT = process.env.BACKEND_PORT || "8000";
const BACKEND_HOST = `http://127.0.0.1:${BACKEND_PORT}`;
const tokenCache = new Map();
async function getAuthToken(address) {
if (tokenCache.has(address)) {
return tokenCache.get(address);
}
const resp = await fetch(`${BACKEND_HOST}/api/auth/token/`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ address }),
});
if (resp.ok) {
const data = await resp.json();
tokenCache.set(address, data.token);
return data.token;
}
throw new Error(`Failed to get token for ${address}: ${await resp.text()}`);
}
async function main() {
const eventManager = await hre.ethers.getContractAt(
"CyberValleyEventManager",
process.env.PUBLIC_EVENT_MANAGER_ADDRESS,
);
const erc20 = await hre.ethers.getContractAt(
"MockUSDT",
process.env.PUBLIC_ERC20_ADDRESS,
);
const [_, __, completeSlave] = await hre.ethers.getSigners();
const events = [
{ price: 100 }, { price: 50 }, { price: 69 }, ];
const tickets = [
{
owner: completeSlave,
eventId: 0,
categoryId: 0, socials: {
network: "instagram",
value: "@buyer1_event0",
},
},
{
owner: completeSlave,
eventId: 0,
categoryId: 0, socials: {
network: "telegram",
value: "@buyer2_event0",
},
},
{
owner: completeSlave,
eventId: 0,
categoryId: 0, socials: {
network: "discord",
value: "@buyer3_event0",
},
},
{
owner: completeSlave,
eventId: 1,
categoryId: 1, socials: {
network: "discord",
value: "@buyer_event1",
},
},
];
for (const cfg of tickets) {
const orderResponse = await fetch(`${BACKEND_HOST}/api/ipfs/orders/meta`, {
method: "PUT",
body: JSON.stringify({
event_id: cfg.eventId,
buyer_address: cfg.owner.address,
socials: cfg.socials,
tickets: [
{
categoryId: cfg.categoryId,
categoryName: "Standard",
price: events[cfg.eventId].price,
quantity: 1,
},
],
total_tickets: 1,
total_price: events[cfg.eventId].price,
currency: "USDC",
referral_data: "",
}),
headers: {
"Content-Type": "application/json",
Authorization: `Token ${await getAuthToken(cfg.owner.address)}`,
},
});
if (!orderResponse.ok) {
const body = await orderResponse.text();
throw new Error(
`failed to upload order meta with ${body} for config ${JSON.stringify(cfg)}`,
);
}
const order = await orderResponse.json();
const mh = getBytes32FromMultiash(order.cid);
const price = events[cfg.eventId].price;
await (await erc20.connect(cfg.owner).mint(price)).wait();
await (
await erc20
.connect(cfg.owner)
.approve(await eventManager.getAddress(), price)
).wait();
await (
await eventManager
.connect(cfg.owner)
.mintTickets(
cfg.eventId,
cfg.categoryId,
1,
mh.digest,
mh.hashFunction,
mh.size,
"0x0000000000000000000000000000000000000000",
)
).wait();
console.log(
"ticket minted",
"owner",
cfg.owner.address,
"event",
cfg.eventId,
"category",
cfg.categoryId,
"order CID",
order.cid,
);
}
console.log("All tickets minted successfully");
}
function getBytes32FromMultiash(multihash) {
const decoded = bs58.decode(multihash);
return {
digest: `0x${Buffer.from(decoded.slice(2)).toString("hex")}`,
hashFunction: decoded[0],
size: decoded[1],
};
}
main().catch((error) => {
console.error(error);
process.exit(1);
});