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>
 |