Skip to content

Commit

Permalink
Merge pull request #10 from Snowfork/bhushan/decision-model
Browse files Browse the repository at this point in the history
Added decision model contract
  • Loading branch information
rubydog authored Mar 30, 2021
2 parents d5fd8f5 + 9281f27 commit 6a4c4dc
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 1 deletion.
54 changes: 54 additions & 0 deletions contracts/GovernanceDecisions.sol
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;
}
}
11 changes: 10 additions & 1 deletion hardhat.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,16 @@ require("hardhat-deploy");
const secrets = require('./secrets');

module.exports = {
solidity: "0.5.16",
solidity: {
compilers: [
{
version: "0.5.16"
},
{
version: "0.6.7",
}
]
},
networks: {
ropsten: {
url: `https://ropsten.infura.io/v3/${secrets.infuraProjectID}`,
Expand Down
58 changes: 58 additions & 0 deletions test/GovernanceDecisions.test.js
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")
});
});
});

0 comments on commit 6a4c4dc

Please sign in to comment.