Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement ScorchedEarth Mechanics Using ForceMove Protocol #8

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
Prev Previous commit
Next Next commit
Require core app data parameters, payments, user/suggester burn rates…
…, never change
apbendi committed Jul 22, 2020

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit c7fadd27db0ed9129f966f9f50144ee30f60c06b
14 changes: 14 additions & 0 deletions chain/contracts/ScorchedEarth.sol
Original file line number Diff line number Diff line change
@@ -52,6 +52,7 @@ contract ScorchedEarth is ForceMoveApp {

requireInternalCoherence(fromData);
requireInternalCoherence(toData);
requireCoreParametersUnchanged(fromData, toData);

return true;
}
@@ -126,4 +127,17 @@ contract ScorchedEarth is ForceMoveApp {
require(false, 'ScorchedEarth: Invalid phase');
}
}

function requireCoreParametersUnchanged(
SEData memory _fromData,
SEData memory _toData
) private pure
{
require(
_fromData.payment == _toData.payment &&
_fromData.suggesterBurn == _toData.suggesterBurn &&
_fromData.userBurn == _toData.userBurn,
'ScorchedEarth: Core parameters must not change'
);
}
}
87 changes: 87 additions & 0 deletions chain/test/scorched-earth-force-move-test.ts
Original file line number Diff line number Diff line change
@@ -260,4 +260,91 @@ describe('ScorchedEarth Force Move Implementation', () => {
"ScorchedEarth: React Phase must not have suggestion",
);
});

it('should not allow payment parameter to change between turns', async () => {
const outcome = outcomeBuilder.createEncodedOutcome({user: 100, suggester: 100, burner: 0});
const badDataBuilder = new SEDataBuilder({payment: 4, userBurn: 2, suggesterBurn: 2});

const fromData = dataBuilder.createEncodedSEData({
phase: Phase.Suggest,
reaction: Reaction.None,
suggestion: suggestion,
});

const toData = badDataBuilder.createEncodedSEData({
phase: Phase.React,
reaction: Reaction.Burn,
suggestion: '',
});

let validationTx = instance.validTransition(
{outcome, appData: fromData},
{outcome, appData: toData},
4,
2,
);

await expectRevert(
validationTx,
"ScorchedEarth: Core parameters must not change",
);
});

it('should not allow userBurn parameter to change between turns', async () => {
const outcome = outcomeBuilder.createEncodedOutcome({user: 100, suggester: 100, burner: 0});
const badDataBuilder = new SEDataBuilder({payment: 5, userBurn: 3, suggesterBurn: 2});

const fromData = dataBuilder.createEncodedSEData({
phase: Phase.Suggest,
reaction: Reaction.None,
suggestion: suggestion,
});

const toData = badDataBuilder.createEncodedSEData({
phase: Phase.React,
reaction: Reaction.Burn,
suggestion: '',
});

let validationTx = instance.validTransition(
{outcome, appData: fromData},
{outcome, appData: toData},
4,
2,
);

await expectRevert(
validationTx,
"ScorchedEarth: Core parameters must not change",
);
});

it('should not allow suggesterBurn parameter to change between turns', async () => {
const outcome = outcomeBuilder.createEncodedOutcome({user: 100, suggester: 100, burner: 0});
const badDataBuilder = new SEDataBuilder({payment: 5, userBurn: 2, suggesterBurn:1});

const fromData = badDataBuilder.createEncodedSEData({
phase: Phase.Suggest,
reaction: Reaction.None,
suggestion: suggestion,
});

const toData = dataBuilder.createEncodedSEData({
phase: Phase.React,
reaction: Reaction.Burn,
suggestion: '',
});

let validationTx = instance.validTransition(
{outcome, appData: fromData},
{outcome, appData: toData},
4,
2,
);

await expectRevert(
validationTx,
"ScorchedEarth: Core parameters must not change",
);
});
});