@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
JavaScript
;
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");
});
});