-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #10 from Snowfork/bhushan/decision-model
Added decision model contract
- Loading branch information
Showing
3 changed files
with
122 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
pragma solidity ^0.6.7; | ||
pragma experimental ABIEncoderV2; | ||
|
||
import "@openzeppelin/contracts/access/AccessControl.sol"; | ||
|
||
contract GovernanceDecisions is AccessControl { | ||
|
||
bytes32 public constant GOVERNOR_ROLE = keccak256("GOVERNOR_ROLE"); | ||
|
||
uint8 public marketplaceFee; | ||
string[] private marketplaceCategories; | ||
string[] private memberships; | ||
|
||
event MarketplaceFeeChanged(uint8 oldFee, uint8 newFee); | ||
event MarketplaceCategoryAdded(string category); | ||
event MemberAdded(string member); | ||
|
||
constructor(address governor_) public { | ||
_setupRole(GOVERNOR_ROLE, governor_); | ||
marketplaceFee = 1; // set default marketplace fee | ||
} | ||
|
||
function setMarketplaceFee(uint8 fee) external { | ||
require(hasRole(GOVERNOR_ROLE, msg.sender), "DecisionModel::setMarketplaceFee ACCESS FORBIDDEN"); | ||
require(fee < 100, "DecisionModel::setMarketplaceFee fee must be less than 100"); | ||
|
||
uint8 oldFee; | ||
oldFee = marketplaceFee; | ||
marketplaceFee = fee; | ||
emit MarketplaceFeeChanged(oldFee, marketplaceFee); | ||
} | ||
|
||
function addMarketplaceCategory(string calldata category) external { | ||
require(hasRole(GOVERNOR_ROLE, msg.sender), "DecisionModel::setMarketplaceFee ACCESS FORBIDDEN"); | ||
|
||
marketplaceCategories.push(category); | ||
emit MarketplaceCategoryAdded(category); | ||
} | ||
|
||
function getMarketplaceCategories() public view returns (string[] memory) { | ||
return marketplaceCategories; | ||
} | ||
|
||
function addMember(string calldata member) external { | ||
require(hasRole(GOVERNOR_ROLE, msg.sender), "DecisionModel::setMarketplaceFee ACCESS FORBIDDEN"); | ||
|
||
memberships.push(member); | ||
emit MemberAdded(member); | ||
} | ||
|
||
function getMemberships() public view returns (string[] memory) { | ||
return memberships; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
const GovernanceDecisions = artifacts.require("GovernanceDecisions"); | ||
require("chai") | ||
.use(require("chai-as-promised")) | ||
.expect(); | ||
|
||
describe("GovernanceDecisions", () => { | ||
let root, governor, a1, accounts; | ||
let decisionModel; | ||
|
||
beforeEach(async () => { | ||
[root, governor, a1, ...accounts] = await web3.eth.getAccounts(); | ||
|
||
decisionModel = await GovernanceDecisions.new(governor); | ||
}); | ||
|
||
describe("marketplaceFee", () => { | ||
it("has default fee", async () => { | ||
let result = await decisionModel.marketplaceFee(); | ||
expect(result.toString()).to.equal("1") | ||
}); | ||
|
||
it("allows governor to set fee", async () => { | ||
await decisionModel.setMarketplaceFee(10, { from: governor }); | ||
let result = await decisionModel.marketplaceFee(); | ||
expect(result.toString()).to.equal("10") | ||
}); | ||
|
||
it("reverts if the fee is greater than 99", async () => { | ||
expect(decisionModel.setMarketplaceFee(100, { from: governor })).to.eventually.be.rejectedWith("revert DecisionModel::setMarketplaceFee fee must be less than 100") | ||
}) | ||
|
||
it("reverts if the sender is not governor", async () => { | ||
expect(decisionModel.setMarketplaceFee(20, { from: a1 })).to.eventually.be.rejectedWith("revert DecisionModel::setMarketplaceFee ACCESS FORBIDDEN") | ||
}); | ||
}); | ||
|
||
describe("marketplaceCatgories", () => { | ||
it("allows governor to add category", async () => { | ||
await decisionModel.addMarketplaceCategory("sample category", { from: governor }); | ||
expect(await decisionModel.getMarketplaceCategories()).to.include("sample category") | ||
}); | ||
|
||
it("reverts if the sender is not governor", async () => { | ||
expect(decisionModel.addMarketplaceCategory("sample category", { from: a1 })).to.eventually.be.rejectedWith("revert DecisionModel::setMarketplaceFee ACCESS FORBIDDEN") | ||
}); | ||
}); | ||
|
||
describe("memberships", () => { | ||
it("allows governor to add membership", async () => { | ||
await decisionModel.addMember("sample member", { from: governor }); | ||
expect(await decisionModel.getMemberships()).to.include("sample member") | ||
}); | ||
|
||
it("reverts if the sender is not governor", async () => { | ||
expect(decisionModel.addMember("sample member", { from: a1 })).to.eventually.be.rejectedWith("revert DecisionModel::setMarketplaceFee ACCESS FORBIDDEN") | ||
}); | ||
}); | ||
}); |