Introduce directory contract (#102)
This commit is contained in:
parent
990d662296
commit
28a623216d
|
@ -0,0 +1,43 @@
|
|||
pragma solidity ^0.8.5;
|
||||
|
||||
contract Directory {
|
||||
address public votingContract;
|
||||
|
||||
address[] public communities;
|
||||
mapping(address => uint256) private communitiesIdx;
|
||||
|
||||
constructor(address _votingContract) {
|
||||
votingContract = _votingContract;
|
||||
}
|
||||
|
||||
function isCommunityInDirectory(address community) public view returns (bool) {
|
||||
return communitiesIdx[community] > 0;
|
||||
}
|
||||
|
||||
function getCommunities() public view returns (address[] memory) {
|
||||
return communities;
|
||||
}
|
||||
|
||||
modifier onlyVotingContract() {
|
||||
require(msg.sender == votingContract, 'Invalid sender');
|
||||
_;
|
||||
}
|
||||
|
||||
function addCommunity(address community) public onlyVotingContract {
|
||||
require(communitiesIdx[community] == 0, 'Community already exist');
|
||||
communities.push(community);
|
||||
communitiesIdx[community] = communities.length;
|
||||
}
|
||||
|
||||
function removeCommunity(address community) public onlyVotingContract {
|
||||
uint256 index = communitiesIdx[community];
|
||||
if (index == 0) return;
|
||||
index--;
|
||||
if (communities.length > 1) {
|
||||
communities[index] = communities[communities.length - 1];
|
||||
communitiesIdx[communities[index]] = index + 1;
|
||||
}
|
||||
communities.pop();
|
||||
communitiesIdx[community] = 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
import { expect, use } from 'chai'
|
||||
import { loadFixture, deployContract, solidity } from 'ethereum-waffle'
|
||||
import Directory from '../build/Directory.json'
|
||||
|
||||
use(solidity)
|
||||
|
||||
describe('directory contract', () => {
|
||||
const communities = [
|
||||
'0xAcdd71e5Ef3Ab3356d62da78A941aAc08a18CF2b',
|
||||
'0xF1B65D4b7e5D6aE45c66Bc015e2556f228A6968f',
|
||||
'0xadd590e785c0Da8B7A39A344e76fCF02193b3641',
|
||||
]
|
||||
async function fixture([alice, bob]: any[], provider: any) {
|
||||
const contract = await deployContract(alice, Directory, [alice.address])
|
||||
return { contract, alice, bob, provider }
|
||||
}
|
||||
|
||||
it('deploys', async () => {
|
||||
const { contract, alice } = await loadFixture(fixture)
|
||||
expect(await contract.votingContract()).to.eq(alice.address)
|
||||
})
|
||||
|
||||
it('adds community', async () => {
|
||||
const { contract } = await loadFixture(fixture)
|
||||
await contract.addCommunity(communities[0])
|
||||
expect(await contract.getCommunities()).to.deep.eq([communities[0]])
|
||||
await contract.addCommunity(communities[1])
|
||||
expect(await contract.getCommunities()).to.deep.eq([communities[0], communities[1]])
|
||||
})
|
||||
|
||||
it('only owner can add', async () => {
|
||||
const { contract, bob } = await loadFixture(fixture)
|
||||
const bobContract = contract.connect(bob)
|
||||
await expect(bobContract.addCommunity(communities[0])).to.be.revertedWith('Invalid sender')
|
||||
expect(await contract.getCommunities()).to.deep.eq([])
|
||||
})
|
||||
|
||||
it('only owner can remove', async () => {
|
||||
const { contract, bob } = await loadFixture(fixture)
|
||||
await contract.addCommunity(communities[0])
|
||||
const bobContract = contract.connect(bob)
|
||||
await expect(bobContract.removeCommunity(communities[0])).to.be.revertedWith('Invalid sender')
|
||||
expect(await contract.getCommunities()).to.deep.eq([communities[0]])
|
||||
})
|
||||
|
||||
it('removes community', async () => {
|
||||
const { contract } = await loadFixture(fixture)
|
||||
await contract.addCommunity(communities[0])
|
||||
await contract.addCommunity(communities[1])
|
||||
await contract.addCommunity(communities[2])
|
||||
await contract.removeCommunity(communities[1])
|
||||
expect(await contract.getCommunities()).to.deep.eq([communities[0], communities[2]])
|
||||
})
|
||||
|
||||
it("can't add duplicate", async () => {
|
||||
const { contract } = await loadFixture(fixture)
|
||||
await contract.addCommunity(communities[0])
|
||||
await expect(contract.addCommunity(communities[0])).to.be.revertedWith('Community already exist')
|
||||
expect(await contract.getCommunities()).to.deep.eq([communities[0]])
|
||||
})
|
||||
|
||||
it('community in directory', async () => {
|
||||
const { contract } = await loadFixture(fixture)
|
||||
await contract.addCommunity(communities[0])
|
||||
|
||||
expect(await contract.isCommunityInDirectory(communities[0])).to.eq(true)
|
||||
expect(await contract.isCommunityInDirectory(communities[1])).to.eq(false)
|
||||
})
|
||||
})
|
Loading…
Reference in New Issue