UNPKG

@vechain/vebetterdao-contracts

Version:

Open-source repository that houses the smart contracts powering the decentralized VeBetterDAO on the VeChain Thor blockchain.

66 lines (65 loc) 2.96 kB
import { getOrDeployContractInstances } from "./deploy"; import { mintLegacyNode } from "./common"; export const getNodeIdFromStakeTx = async (tx) => { const { stargateNftMock } = await getOrDeployContractInstances({}); const nodeStakeTxReceipt = await tx.wait(); // Find the Transfer event and decode it to get the tokenId const transferEvent = nodeStakeTxReceipt?.logs .map(log => { try { return stargateNftMock.interface.parseLog({ topics: log.topics, data: log.data }); } catch { return null; } }) .find(event => event?.name === "Transfer"); if (!transferEvent) throw new Error("No Transfer event found"); const nodeId = transferEvent.args.tokenId; return nodeId; }; export const endorseApp = async (appId, endorser, useLegacyNode = false) => { const { x2EarnApps, nodeManagement, otherAccounts } = await getOrDeployContractInstances({}); let nodeId; // Create a MjolnirX node holder => score = 100, but maxPointsPerNodePerApp = 49 // So we need 3 endorsers to reach 100 points (49 + 49 + 2) if (useLegacyNode) { await mintLegacyNode(7, endorser); const ownerNodes = await nodeManagement.getUserNodes(endorser.address); nodeId = ownerNodes[0].nodeId; } else { nodeId = await createNodeHolder(7, endorser); } // Primary endorser contributes 49 points const tx = await x2EarnApps.connect(endorser).endorseApp(appId, nodeId, 49); const txReceipt = await tx.wait(); // Get 2 additional accounts from the end of otherAccounts to avoid conflicts const extra1 = otherAccounts[otherAccounts.length - 3]; const extra2 = otherAccounts[otherAccounts.length - 2]; // Create nodes for additional endorsers const nodeId2 = await createNodeHolder(7, extra1); const nodeId3 = await createNodeHolder(7, extra2); // Additional endorsers contribute 49 + 2 = 51 points (total = 100) await x2EarnApps.connect(extra1).endorseApp(appId, nodeId2, 49); await x2EarnApps.connect(extra2).endorseApp(appId, nodeId3, 2); const event = txReceipt?.logs[0]; if (!event) throw new Error("No endorsement event found"); return { nodeId, txReceipt }; }; export const createNodeHolder = async (level, endorser) => { const { stargateMock, stargateNftMock } = await getOrDeployContractInstances({}); const nodeStakeTx = await stargateMock .connect(endorser) .stake(level, { value: (await stargateNftMock.getLevel(level)).vetAmountRequiredToStake }); const nodeId = await getNodeIdFromStakeTx(nodeStakeTx); return nodeId; }; export const createLegacyNodeHolder = async (level, endorser) => { const { nodeManagement } = await getOrDeployContractInstances({}); await mintLegacyNode(level, endorser); const ownerNodes = await nodeManagement.getUserNodes(endorser.address); return ownerNodes[0].nodeId; };