Compare commits
5 Commits
tests/cont
...
kit/add-va
| Author | SHA1 | Date | |
|---|---|---|---|
| e2d5d704ce | |||
| e0372d3eb4 | |||
| 42c469bbc6 | |||
| d4b7dbf99d | |||
| 1fd40dbf84 |
4
.github/release-drafter.yml
vendored
4
.github/release-drafter.yml
vendored
@@ -1,4 +0,0 @@
|
|||||||
template: |
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
$CHANGES
|
|
||||||
@@ -21,8 +21,8 @@ contract Contribution is AragonApp {
|
|||||||
bytes32 public constant KERNEL_APP_ADDR_NAMESPACE = 0xd6f028ca0e8edb4a8c9757ca4fdccab25fa1e0317da1188108f7d2dee14902fb;
|
bytes32 public constant KERNEL_APP_ADDR_NAMESPACE = 0xd6f028ca0e8edb4a8c9757ca4fdccab25fa1e0317da1188108f7d2dee14902fb;
|
||||||
|
|
||||||
// ensure alphabetic order
|
// ensure alphabetic order
|
||||||
enum Apps { Contribution, Contributor, Proposal, Token }
|
enum Apps { Contribution, Contributor, Proposal, Token, Vault }
|
||||||
bytes32[4] public appIds;
|
bytes32[5] public appIds;
|
||||||
|
|
||||||
struct ContributionData {
|
struct ContributionData {
|
||||||
uint32 contributorId;
|
uint32 contributorId;
|
||||||
@@ -54,7 +54,7 @@ contract Contribution is AragonApp {
|
|||||||
event ContributionClaimed(uint32 id, uint32 indexed contributorId, uint32 amount);
|
event ContributionClaimed(uint32 id, uint32 indexed contributorId, uint32 amount);
|
||||||
event ContributionVetoed(uint32 id, address vetoedByAccount);
|
event ContributionVetoed(uint32 id, address vetoedByAccount);
|
||||||
|
|
||||||
function initialize(bytes32[4] _appIds) public onlyInit {
|
function initialize(bytes32[5] _appIds) public onlyInit {
|
||||||
appIds = _appIds;
|
appIds = _appIds;
|
||||||
blocksToWait = 40320; // 7 days; 15 seconds block time
|
blocksToWait = 40320; // 7 days; 15 seconds block time
|
||||||
initialized();
|
initialized();
|
||||||
|
|||||||
@@ -28,14 +28,14 @@ contract Contributor is AragonApp {
|
|||||||
uint32 public contributorsCount;
|
uint32 public contributorsCount;
|
||||||
|
|
||||||
// ensure alphabetic order
|
// ensure alphabetic order
|
||||||
enum Apps { Contribution, Contributor, Proposal, Token }
|
enum Apps { Contribution, Contributor, Proposal, Token, Vault }
|
||||||
bytes32[4] public appIds;
|
bytes32[5] public appIds;
|
||||||
|
|
||||||
event ContributorProfileUpdated(uint32 id, bytes32 oldHashDigest, bytes32 newHashDigest); // what should be logged
|
event ContributorProfileUpdated(uint32 id, bytes32 oldHashDigest, bytes32 newHashDigest); // what should be logged
|
||||||
event ContributorAccountUpdated(uint32 id, address oldAccount, address newAccount);
|
event ContributorAccountUpdated(uint32 id, address oldAccount, address newAccount);
|
||||||
event ContributorAdded(uint32 id, address account);
|
event ContributorAdded(uint32 id, address account);
|
||||||
|
|
||||||
function initialize(address root,bytes32[4] _appIds) public onlyInit {
|
function initialize(address root, bytes32[5] _appIds) public onlyInit {
|
||||||
appIds = _appIds;
|
appIds = _appIds;
|
||||||
|
|
||||||
initialized();
|
initialized();
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ contract Proposal is AragonApp {
|
|||||||
|
|
||||||
bytes32 public constant KERNEL_APP_ADDR_NAMESPACE = 0xd6f028ca0e8edb4a8c9757ca4fdccab25fa1e0317da1188108f7d2dee14902fb;
|
bytes32 public constant KERNEL_APP_ADDR_NAMESPACE = 0xd6f028ca0e8edb4a8c9757ca4fdccab25fa1e0317da1188108f7d2dee14902fb;
|
||||||
// ensure alphabetic order
|
// ensure alphabetic order
|
||||||
enum Apps { Contribution, Contributor, Proposal, Token }
|
enum Apps { Contribution, Contributor, Proposal, Token, Vault }
|
||||||
bytes32[4] public appIds;
|
bytes32[5] public appIds;
|
||||||
|
|
||||||
struct Proposal {
|
struct Proposal {
|
||||||
address creatorAccount;
|
address creatorAccount;
|
||||||
@@ -46,7 +46,7 @@ contract Proposal is AragonApp {
|
|||||||
event ProposalVoted(uint32 id, uint32 voterId, uint16 totalVotes);
|
event ProposalVoted(uint32 id, uint32 voterId, uint16 totalVotes);
|
||||||
event ProposalExecuted(uint32 id, uint32 contributorId, uint32 amount);
|
event ProposalExecuted(uint32 id, uint32 contributorId, uint32 amount);
|
||||||
|
|
||||||
function initialize(bytes32[4] _appIds) public onlyInit {
|
function initialize(bytes32[5] _appIds) public onlyInit {
|
||||||
appIds = _appIds;
|
appIds = _appIds;
|
||||||
initialized();
|
initialized();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ contract Token is ERC20Token, AragonApp {
|
|||||||
bytes32 public constant MINT_TOKEN_ROLE = keccak256("MINT_TOKEN_ROLE");
|
bytes32 public constant MINT_TOKEN_ROLE = keccak256("MINT_TOKEN_ROLE");
|
||||||
|
|
||||||
// ensure alphabetic order
|
// ensure alphabetic order
|
||||||
enum Apps { Contribution, Contributor, Proposal, Token }
|
enum Apps { Contribution, Contributor, Proposal, Token, Vault }
|
||||||
bytes32[4] public appIds;
|
bytes32[5] public appIds;
|
||||||
|
|
||||||
event LogMint(address indexed recipient, uint256 amount, uint32 contributionId);
|
event LogMint(address indexed recipient, uint256 amount, uint32 contributionId);
|
||||||
|
|
||||||
function initialize(bytes32[4] _appIds) public onlyInit {
|
function initialize(bytes32[5] _appIds) public onlyInit {
|
||||||
appIds = _appIds;
|
appIds = _appIds;
|
||||||
name = 'Kredits';
|
name = 'Kredits';
|
||||||
symbol = '₭S';
|
symbol = '₭S';
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import "@aragon/os/contracts/acl/ACL.sol";
|
|||||||
|
|
||||||
import "@aragon/kits-base/contracts/KitBase.sol";
|
import "@aragon/kits-base/contracts/KitBase.sol";
|
||||||
|
|
||||||
|
import "@aragon/apps-vault/contracts/Vault.sol";
|
||||||
|
|
||||||
import "../apps/contribution/contracts/Contribution.sol";
|
import "../apps/contribution/contracts/Contribution.sol";
|
||||||
import "../apps/contributor/contracts/Contributor.sol";
|
import "../apps/contributor/contracts/Contributor.sol";
|
||||||
import "../apps/token/contracts/Token.sol";
|
import "../apps/token/contracts/Token.sol";
|
||||||
@@ -14,13 +16,13 @@ import "../apps/proposal/contracts/Proposal.sol";
|
|||||||
contract KreditsKit is KitBase {
|
contract KreditsKit is KitBase {
|
||||||
|
|
||||||
// ensure alphabetic order
|
// ensure alphabetic order
|
||||||
enum Apps { Contribution, Contributor, Proposal, Token }
|
enum Apps { Contribution, Contributor, Proposal, Token, Vault }
|
||||||
bytes32[4] public appIds;
|
bytes32[5] public appIds;
|
||||||
|
|
||||||
event DeployInstance(address dao);
|
event DeployInstance(address dao);
|
||||||
event InstalledApp(address dao, address appProxy, bytes32 appId);
|
event InstalledApp(address dao, address appProxy, bytes32 appId);
|
||||||
|
|
||||||
constructor (DAOFactory _fac, ENS _ens, bytes32[4] _appIds) public KitBase(_fac, _ens) {
|
constructor (DAOFactory _fac, ENS _ens, bytes32[5] _appIds) public KitBase(_fac, _ens) {
|
||||||
appIds = _appIds;
|
appIds = _appIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,6 +46,9 @@ contract KreditsKit is KitBase {
|
|||||||
Proposal proposal = Proposal(_installApp(dao, appIds[uint8(Apps.Proposal)]));
|
Proposal proposal = Proposal(_installApp(dao, appIds[uint8(Apps.Proposal)]));
|
||||||
proposal.initialize(appIds);
|
proposal.initialize(appIds);
|
||||||
|
|
||||||
|
Vault vault = Vault(_installApp(dao, appIds[uint8(Apps.Vault)]));
|
||||||
|
vault.initialize();
|
||||||
|
|
||||||
acl.createPermission(root, contribution, contribution.ADD_CONTRIBUTION_ROLE(), this);
|
acl.createPermission(root, contribution, contribution.ADD_CONTRIBUTION_ROLE(), this);
|
||||||
acl.createPermission(root, contribution, contribution.VETO_CONTRIBUTION_ROLE(), this);
|
acl.createPermission(root, contribution, contribution.VETO_CONTRIBUTION_ROLE(), this);
|
||||||
acl.grantPermission(proposal, contribution, contribution.ADD_CONTRIBUTION_ROLE());
|
acl.grantPermission(proposal, contribution, contribution.ADD_CONTRIBUTION_ROLE());
|
||||||
@@ -72,6 +77,10 @@ contract KreditsKit is KitBase {
|
|||||||
acl.grantPermission(contribution, token, token.MINT_TOKEN_ROLE());
|
acl.grantPermission(contribution, token, token.MINT_TOKEN_ROLE());
|
||||||
acl.setPermissionManager(root, token, token.MINT_TOKEN_ROLE());
|
acl.setPermissionManager(root, token, token.MINT_TOKEN_ROLE());
|
||||||
|
|
||||||
|
// Vault permissions
|
||||||
|
acl.createPermission(root, vault, vault.TRANSFER_ROLE(), this);
|
||||||
|
//TODO: grant rewards app permission to transfer funds
|
||||||
|
//acl.grantPermission(rewards, vault, vault.TRANSFER_ROLE());
|
||||||
|
|
||||||
cleanupDAOPermissions(dao, acl, root);
|
cleanupDAOPermissions(dao, acl, root);
|
||||||
|
|
||||||
|
|||||||
@@ -13,4 +13,4 @@ import "@aragon/os/contracts/factory/DAOFactory.sol";
|
|||||||
// solium-disable-next-line no-empty-blocks
|
// solium-disable-next-line no-empty-blocks
|
||||||
contract Spoof {
|
contract Spoof {
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
@@ -28,7 +28,7 @@ class Contributor {
|
|||||||
github_username,
|
github_username,
|
||||||
gitea_username,
|
gitea_username,
|
||||||
wiki_username,
|
wiki_username,
|
||||||
zoom_display_name,
|
accounts,
|
||||||
} = this;
|
} = this;
|
||||||
|
|
||||||
let data = {
|
let data = {
|
||||||
@@ -36,7 +36,7 @@ class Contributor {
|
|||||||
'@type': 'Contributor',
|
'@type': 'Contributor',
|
||||||
kind,
|
kind,
|
||||||
name,
|
name,
|
||||||
accounts: [],
|
accounts: accounts || [],
|
||||||
};
|
};
|
||||||
|
|
||||||
if (url) {
|
if (url) {
|
||||||
@@ -68,13 +68,6 @@ class Contributor {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zoom_display_name) {
|
|
||||||
data.accounts.push({
|
|
||||||
'site': 'zoom.us',
|
|
||||||
'username': zoom_display_name,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write it pretty to ipfs
|
// Write it pretty to ipfs
|
||||||
return JSON.stringify(data, null, 2);
|
return JSON.stringify(data, null, 2);
|
||||||
}
|
}
|
||||||
@@ -104,11 +97,10 @@ class Contributor {
|
|||||||
accounts,
|
accounts,
|
||||||
} = JSON.parse(serialized.toString('utf8'));
|
} = JSON.parse(serialized.toString('utf8'));
|
||||||
|
|
||||||
let github_username, github_uid, gitea_username, wiki_username, zoom_display_name;
|
let github_username, github_uid, gitea_username, wiki_username;
|
||||||
let github = accounts.find(a => a.site === 'github.com');
|
let github = accounts.find(a => a.site === 'github.com');
|
||||||
let gitea = accounts.find(a => a.site === 'gitea.kosmos.org');
|
let gitea = accounts.find(a => a.site === 'gitea.kosmos.org');
|
||||||
let wiki = accounts.find(a => a.site === 'wiki.kosmos.org');
|
let wiki = accounts.find(a => a.site === 'wiki.kosmos.org');
|
||||||
let zoom = accounts.find(a => a.site === 'zoom.us');
|
|
||||||
|
|
||||||
if (github) {
|
if (github) {
|
||||||
(({ username: github_username, uid: github_uid} = github));
|
(({ username: github_username, uid: github_uid} = github));
|
||||||
@@ -119,9 +111,6 @@ class Contributor {
|
|||||||
if (wiki) {
|
if (wiki) {
|
||||||
(({ username: wiki_username } = wiki));
|
(({ username: wiki_username } = wiki));
|
||||||
}
|
}
|
||||||
if (zoom) {
|
|
||||||
(({ username: zoom_display_name } = zoom));
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name,
|
name,
|
||||||
@@ -132,7 +121,6 @@ class Contributor {
|
|||||||
github_username,
|
github_username,
|
||||||
gitea_username,
|
gitea_username,
|
||||||
wiki_username,
|
wiki_username,
|
||||||
zoom_display_name,
|
|
||||||
ipfsData: serialized,
|
ipfsData: serialized,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
561
package-lock.json
generated
561
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -58,6 +58,7 @@
|
|||||||
"yargs": "^12.0.0"
|
"yargs": "^12.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@aragon/apps-vault": "^4.1.0",
|
||||||
"ethers": "^4.0.29",
|
"ethers": "^4.0.29",
|
||||||
"ipfs-http-client": "^30.1.3",
|
"ipfs-http-client": "^30.1.3",
|
||||||
"kosmos-schemas": "^2.1.0",
|
"kosmos-schemas": "^2.1.0",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ contract('DAO bare kit', (accounts) => {
|
|||||||
let contributor;
|
let contributor;
|
||||||
let proposal;
|
let proposal;
|
||||||
let token;
|
let token;
|
||||||
|
let vault;
|
||||||
|
|
||||||
before(async () => {
|
before(async () => {
|
||||||
//apps id
|
//apps id
|
||||||
@@ -23,12 +24,13 @@ contract('DAO bare kit', (accounts) => {
|
|||||||
appsId[1] = namehash("kredits-contributor");
|
appsId[1] = namehash("kredits-contributor");
|
||||||
appsId[2] = namehash("kredits-proposal");
|
appsId[2] = namehash("kredits-proposal");
|
||||||
appsId[3] = namehash("kredits-token");
|
appsId[3] = namehash("kredits-token");
|
||||||
|
appsId[4] = namehash("vault");
|
||||||
|
|
||||||
const kernelBase = await getContract('Kernel').new(true); // petrify immediately
|
const kernelBase = await getContract('Kernel').new(true); // petrify immediately
|
||||||
const aclBase = await getContract('ACL').new();
|
const aclBase = await getContract('ACL').new();
|
||||||
const daoFactory = await getContract('DAOFactory').new(kernelBase.address, aclBase.address, ZERO_ADDR);
|
const daoFactory = await getContract('DAOFactory').new(kernelBase.address, aclBase.address, ZERO_ADDR);
|
||||||
|
|
||||||
kreditsKit = await KreditsKit.new(daoFactory.address, ENS_ADDRESS, appsId, { from: accounts[0] });
|
kreditsKit = await KreditsKit.new(ZERO_ADDR, ENS_ADDRESS, appsId, { from: accounts[0] });
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("New DAO instance", () => {
|
describe("New DAO instance", () => {
|
||||||
@@ -52,8 +54,9 @@ contract('DAO bare kit', (accounts) => {
|
|||||||
it('it should install apps', async () => {
|
it('it should install apps', async () => {
|
||||||
apps[0].id.should.equal(namehash('kredits-contribution'));
|
apps[0].id.should.equal(namehash('kredits-contribution'));
|
||||||
apps[1].id.should.equal(namehash('kredits-contributor'));
|
apps[1].id.should.equal(namehash('kredits-contributor'));
|
||||||
apps[2].id.should.equal(namehash('kredits-proposal'));
|
apps[0].id.should.equal(namehash('kredits-proposal'));
|
||||||
apps[3].id.should.equal(namehash('kredits-token'));
|
apps[1].id.should.equal(namehash('kredits-token'));
|
||||||
|
apps[0].id.should.equal(namehash('vault'));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('it should initialize apps', async () => {
|
it('it should initialize apps', async () => {
|
||||||
@@ -61,12 +64,14 @@ contract('DAO bare kit', (accounts) => {
|
|||||||
contributor = await getContract('Contributor').at(apps[1].proxy);
|
contributor = await getContract('Contributor').at(apps[1].proxy);
|
||||||
proposal = await getContract('Proposal').at(apps[2].proxy);
|
proposal = await getContract('Proposal').at(apps[2].proxy);
|
||||||
token = await getContract('Token').at(apps[3].proxy);
|
token = await getContract('Token').at(apps[3].proxy);
|
||||||
|
vault = await getContract('Vault').at(apps[4].proxy);
|
||||||
(await Promise.all([
|
(await Promise.all([
|
||||||
contribution.hasInitialized(),
|
contribution.hasInitialized(),
|
||||||
contributor.hasInitialized(),
|
contributor.hasInitialized(),
|
||||||
proposal.hasInitialized(),
|
proposal.hasInitialized(),
|
||||||
token.hasInitialized(),
|
token.hasInitialized(),
|
||||||
])).should.deep.equal([true, true, true, true]);
|
vault.hasInitialized(),
|
||||||
|
])).should.deep.equal([true, true, true, true, true]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('it should set permissions', async () => {
|
it('it should set permissions', async () => {
|
||||||
@@ -81,7 +86,9 @@ contract('DAO bare kit', (accounts) => {
|
|||||||
//token app roles
|
//token app roles
|
||||||
kernel.hasPermission(accounts[0], token.address, await token.MINT_TOKEN_ROLE(), '0x0'),
|
kernel.hasPermission(accounts[0], token.address, await token.MINT_TOKEN_ROLE(), '0x0'),
|
||||||
kernel.hasPermission(contribution.address, token.address, await token.MINT_TOKEN_ROLE(), '0x0'),
|
kernel.hasPermission(contribution.address, token.address, await token.MINT_TOKEN_ROLE(), '0x0'),
|
||||||
])).should.deep.equal([true, true, true, true, true, true]);
|
//vaul app roles
|
||||||
|
kernel.hasPermission(accounts[0], vault.address, await vault.TRANSFER_ROLE(), '0x0'),
|
||||||
|
])).should.deep.equal([true, true, true, true, true, true, true]);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user