UNPKG

@vechain/vebetterdao-contracts

Version:

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

92 lines (91 loc) 7.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const chai_1 = require("chai"); const mocha_1 = require("mocha"); const fixture_test_1 = require("./fixture.test"); // V6 changed the storage key of per-round action counts from passport to actor. // These tests pin the new semantics: each wallet's own actions count under that wallet, // linked entities no longer pool into the passport slot, and PoP scores keep aggregating // at the passport so isPerson is unchanged. (0, mocha_1.describe)("VeBetterPassport V6 Actor-Keyed Counts - @shard8g", function () { (0, mocha_1.it)("count fields are keyed by the actor wallet, not the passport", async function () { const { veBetterPassport, owner, otherAccounts, appId } = await (0, fixture_test_1.setupSignalingFixture)(); const passport = otherAccounts[2]; const entity = otherAccounts[3]; // Link entity → passport so that any action by `entity` resolves to `passport`. await veBetterPassport.connect(entity).linkEntityToPassport(passport.address); await veBetterPassport.connect(passport).acceptEntityLink(entity.address); // 4 actions by the passport, 4 actions by the linked entity. for (let i = 0; i < 4; i++) { await veBetterPassport.connect(owner).registerActionForRound(passport.address, appId, 1); await veBetterPassport.connect(owner).registerActionForRound(entity.address, appId, 1); } // Each wallet's own counter holds only its own actions. (0, chai_1.expect)(await veBetterPassport.userRoundActionCount(passport.address, 1)).to.equal(4); (0, chai_1.expect)(await veBetterPassport.userRoundActionCount(entity.address, 1)).to.equal(4); (0, chai_1.expect)(await veBetterPassport.userRoundActionCountApp(passport.address, 1, appId)).to.equal(4); (0, chai_1.expect)(await veBetterPassport.userRoundActionCountApp(entity.address, 1, appId)).to.equal(4); (0, chai_1.expect)(await veBetterPassport.userRoundAppCount(passport.address, 1)).to.equal(1); (0, chai_1.expect)(await veBetterPassport.userRoundAppCount(entity.address, 1)).to.equal(1); }); (0, mocha_1.it)("entity-as-participant zero-case is fixed: querying the entity returns its own actions", async function () { const { veBetterPassport, owner, otherAccounts, appId } = await (0, fixture_test_1.setupSignalingFixture)(); const passport = otherAccounts[2]; const entity = otherAccounts[3]; await veBetterPassport.connect(entity).linkEntityToPassport(passport.address); await veBetterPassport.connect(passport).acceptEntityLink(entity.address); await veBetterPassport.connect(owner).registerActionForRound(entity.address, appId, 1); await veBetterPassport.connect(owner).registerActionForRound(entity.address, appId, 1); // Pre-V6 the entity's slot would have read 0 (everything routed to passport). Now it reads 2. (0, chai_1.expect)(await veBetterPassport.userRoundActionCount(entity.address, 1)).to.equal(2); (0, chai_1.expect)(await veBetterPassport.userRoundActionCountApp(entity.address, 1, appId)).to.equal(2); }); (0, mocha_1.it)("score fields stay keyed by passport so PoP cumulative score still aggregates linked entities", async function () { const { veBetterPassport, owner, otherAccounts, appId } = await (0, fixture_test_1.setupSignalingFixture)(); const passport = otherAccounts[2]; const entity = otherAccounts[3]; await veBetterPassport.connect(entity).linkEntityToPassport(passport.address); await veBetterPassport.connect(passport).acceptEntityLink(entity.address); await veBetterPassport.connect(owner).registerActionForRound(passport.address, appId, 1); await veBetterPassport.connect(owner).registerActionForRound(entity.address, appId, 1); await veBetterPassport.connect(owner).registerActionForRound(entity.address, appId, 1); const securityMultiplier = await veBetterPassport.securityMultiplier(1); const expectedPassportScore = securityMultiplier * 3n; // Score aggregates at the passport (3 actions total). (0, chai_1.expect)(await veBetterPassport.userRoundScore(passport.address, 1)).to.equal(expectedPassportScore); // Entity's own score slot is 0 — scores route to passport, only counts route to actor. (0, chai_1.expect)(await veBetterPassport.userRoundScore(entity.address, 1)).to.equal(0); // Same for the all-time / per-app score aggregates. (0, chai_1.expect)(await veBetterPassport.userTotalScore(passport.address)).to.equal(expectedPassportScore); (0, chai_1.expect)(await veBetterPassport.userAppTotalScore(passport.address, appId)).to.equal(expectedPassportScore); (0, chai_1.expect)(await veBetterPassport.userRoundScoreApp(passport.address, 1, appId)).to.equal(expectedPassportScore); }); (0, mocha_1.it)("appRoundActionCount continues to count every action regardless of actor", async function () { const { veBetterPassport, owner, otherAccounts, appId } = await (0, fixture_test_1.setupSignalingFixture)(); const passport = otherAccounts[2]; const entity = otherAccounts[3]; await veBetterPassport.connect(entity).linkEntityToPassport(passport.address); await veBetterPassport.connect(passport).acceptEntityLink(entity.address); await veBetterPassport.connect(owner).registerActionForRound(passport.address, appId, 1); await veBetterPassport.connect(owner).registerActionForRound(entity.address, appId, 1); await veBetterPassport.connect(owner).registerActionForRound(entity.address, appId, 1); // Global per-app counter unaffected by the keying change. (0, chai_1.expect)(await veBetterPassport.appRoundActionCount(appId, 1)).to.equal(3); }); (0, mocha_1.it)("self-passport (no linked entities) still increments only one slot", async function () { const { veBetterPassport, owner, otherAccounts, appId } = await (0, fixture_test_1.setupSignalingFixture)(); const user = otherAccounts[4]; await veBetterPassport.connect(owner).registerActionForRound(user.address, appId, 1); await veBetterPassport.connect(owner).registerActionForRound(user.address, appId, 1); // Both score (passport-keyed) and count (actor-keyed) reads point to the same address here // since the user is their own passport. (0, chai_1.expect)(await veBetterPassport.userRoundActionCount(user.address, 1)).to.equal(2); (0, chai_1.expect)(await veBetterPassport.userRoundActionCountApp(user.address, 1, appId)).to.equal(2); const securityMultiplier = await veBetterPassport.securityMultiplier(1); (0, chai_1.expect)(await veBetterPassport.userRoundScore(user.address, 1)).to.equal(securityMultiplier * 2n); }); (0, mocha_1.it)("contract version is 6", async function () { const { veBetterPassport } = await (0, fixture_test_1.setupSignalingFixture)(); (0, chai_1.expect)(await veBetterPassport.version()).to.equal("6"); }); });