124 lines
3.6 KiB
HTML
124 lines
3.6 KiB
HTML
<!DOCTYPE html>
|
|
<head>
|
|
<title>Validation Pool test</title>
|
|
<link type="text/css" rel="stylesheet" href="/index.css" />
|
|
</head>
|
|
<body>
|
|
<div id="validation-pool"></div>
|
|
</body>
|
|
<script type="module">
|
|
import { Box } from "/classes/box.js";
|
|
import { Scene } from "/classes/scene.js";
|
|
import { Expert } from "/classes/expert.js";
|
|
import { Bench } from "/classes/bench.js";
|
|
import { delay } from "/util.js";
|
|
|
|
const rootElement = document.getElementById("validation-pool");
|
|
const rootBox = new Box("rootBox", rootElement).flex();
|
|
|
|
const scene = (window.scene = new Scene("Validation Pool test", rootBox).log(
|
|
"sequenceDiagram"
|
|
));
|
|
const member1 = (window.member1 = await new Expert(
|
|
"Expert1",
|
|
scene
|
|
).initialize());
|
|
const member2 = (window.member2 = await new Expert(
|
|
"Expert2",
|
|
scene
|
|
).initialize());
|
|
const bench = (window.bench = new Bench("Bench", scene));
|
|
|
|
const updateDisplayValues = async () => {
|
|
member1.setValue(
|
|
"rep",
|
|
bench.reputations.getTokens(member1.reputationPublicKey)
|
|
);
|
|
member2.setValue(
|
|
"rep",
|
|
bench.reputations.getTokens(member2.reputationPublicKey)
|
|
);
|
|
bench.setValue("total rep", bench.getTotalReputation());
|
|
// With params.lockingTimeExponent = 0 and params.activeVoterThreshold = null,
|
|
// these next 3 propetries are all equal to total rep
|
|
// bench.setValue('available rep', bench.getTotalAvailableReputation());
|
|
// bench.setValue('active rep', bench.getTotalActiveReputation());
|
|
// bench.setValue('active available rep', bench.getTotalActiveAvailableReputation());
|
|
await scene.renderSequenceDiagram();
|
|
};
|
|
|
|
updateDisplayValues();
|
|
await delay(1000);
|
|
|
|
// First member can self-approve
|
|
{
|
|
const pool = await member1.initiateValidationPool(bench, {
|
|
fee: 7,
|
|
duration: 1000,
|
|
tokenLossRatio: 1,
|
|
});
|
|
await member1.revealIdentity(pool);
|
|
// Attempting to evaluate winning conditions before the duration has expired
|
|
// should result in an exception
|
|
try {
|
|
await pool.evaluateWinningConditions();
|
|
} catch (e) {
|
|
if (e.message.match(/Validation pool duration has not yet elapsed/)) {
|
|
console.log(
|
|
"Caught expected error: Validation pool duration has not yet elapsed"
|
|
);
|
|
} else {
|
|
console.error("Unexpected error");
|
|
throw e;
|
|
}
|
|
}
|
|
await delay(1000);
|
|
await pool.evaluateWinningConditions(); // Vote passes
|
|
await updateDisplayValues();
|
|
await delay(1000);
|
|
}
|
|
|
|
// Failure example: second member can not self-approve
|
|
try {
|
|
const pool = await member2.initiateValidationPool(bench, {
|
|
fee: 1,
|
|
duration: 1000,
|
|
tokenLossRatio: 1,
|
|
});
|
|
await member2.revealIdentity(pool);
|
|
await delay(1000);
|
|
await pool.evaluateWinningConditions(); // Quorum not met!
|
|
await updateDisplayValues();
|
|
await delay(1000);
|
|
} catch (e) {
|
|
if (e.message.match(/Quorum is not met/)) {
|
|
console.log("Caught expected error: Quorum not met");
|
|
} else {
|
|
console.error("Unexpected error");
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
// Second member must be approved by first member
|
|
{
|
|
const pool = await member2.initiateValidationPool(bench, {
|
|
fee: 1,
|
|
duration: 1000,
|
|
tokenLossRatio: 1,
|
|
});
|
|
await member1.castVote(pool, { position: true, stake: 4, lockingTime: 0 });
|
|
await member1.revealIdentity(pool);
|
|
await member2.revealIdentity(pool);
|
|
await delay(1000);
|
|
await pool.evaluateWinningConditions(); // Vote passes
|
|
await updateDisplayValues();
|
|
await delay(1000);
|
|
}
|
|
|
|
await updateDisplayValues();
|
|
|
|
scene.deactivateAll();
|
|
|
|
await updateDisplayValues();
|
|
</script>
|