Compare commits

..

10 Commits

Author SHA1 Message Date
b3dab3200f Use postshrinkwrap instead of postinstall
`postinstall` is executed before package-lock.json is written to disk.

https://github.com/npm/npm/issues/18798
2019-06-18 10:30:35 +02:00
165ca8d3fc Add postinstall lockfile fix
https://github.com/67P/kredits-contracts/pull/140
2019-06-17 18:58:31 +02:00
42ef48b34d Make sure fix lockfile uses the correct file path 2019-06-17 09:38:47 +02:00
aacec26d0e Default to open.aragonpm.eth
it is now also available on the devchain
2019-06-15 00:49:26 +02:00
9ac3837f67 I don't know why this is needed but it fixes an npm issue
if install fails node scripts/fix-package-lock.js might help
2019-06-15 00:32:07 +02:00
b32b5e240d package-lock 2019-06-15 00:28:04 +02:00
ee70125139 package-lock 2019-06-15 00:26:38 +02:00
fa6423ed2e Fix fix... don't really know what I am doing 2019-06-15 00:21:54 +02:00
97071c1b60 still broken 2019-06-14 23:56:22 +02:00
9b8004af69 Remove npm cache and use LTS node on travis
Can we have a green build with that?
2019-06-13 18:39:26 +02:00
55 changed files with 170186 additions and 26139 deletions

View File

@@ -28,6 +28,5 @@ module.exports = {
named: 'always', named: 'always',
asyncArrow: 'always', asyncArrow: 'always',
}], }],
'indent': ['error', 2]
} }
} }

View File

@@ -1,4 +0,0 @@
template: |
## Changes
$CHANGES

View File

@@ -6,32 +6,13 @@ node_js:
sudo: false sudo: false
dist: xenial dist: xenial
cache:
directories:
- node_modules
- apps/contribution/node_modules
- apps/contributor/node_modules
- apps/proposal/node_modules
- apps/token/node_modules
- apps/vault/node_modules
install: install:
- npm install -g @aragon/cli
- npm install -g truffle
- npm install - npm install
before_script:
- npm run devchain &
- sleep 10
script: script:
- npm run lint:wrapper - npm run lint:wrapper
- npm run lint:contract-tests - npm run lint:contract-tests
# FIXME Fix tests # - yarn lint:contracts
# - npm run test:token
# - npm run test:contributor
# - npm run test:contribution
# - npm run test:proposal
branches: branches:
only: only:

View File

@@ -14,8 +14,6 @@ framework](http://truffleframework.com/) for some things.
### Installation ### Installation
#### App dependencies
All requirements are defined in `package.json`. All requirements are defined in `package.json`.
$ npm install $ npm install
@@ -27,20 +25,13 @@ Each of the aragon apps are separate packages:
You can use `npm run install-all` to install all app dependencies at once. You can use `npm run install-all` to install all app dependencies at once.
#### Sytem dependencies
Aragon CLI and Truffle need to be installed on your sytem as well:
npm install -g @aragon/cli
npm install -g truffle
### Local development chain ### Local development chain
For local development it is recommended to use For local development it is recommended to use
[ganache](http://truffleframework.com/ganache/) to run a local development [ganache](http://truffleframework.com/ganache/) to run a local development
chain. When using the ganache simulator, no full Ethereum node is required. chain. Using the ganache simulator no full Ethereum node is required.
We use the default aragon-cli devchain command to configure and run a local We use the default aragon-cli devchain command to confgure and run a local
development ganache. development ganache.
$ npm run devchain (or aragon devchain --port 7545) $ npm run devchain (or aragon devchain --port 7545)
@@ -52,10 +43,6 @@ To clear/reset the chain use (e.g. if you run out of funds on your devchain)
We default to port 7545 for development to not get in conflict with the default We default to port 7545 for development to not get in conflict with the default
Ethereum RPC port. Ethereum RPC port.
You can also set certain ganache options to configure the devchain, for example
if you want to increase the block time to 10 seconds you can add
`--block-time=10`.
### Bootstrap ### Bootstrap
1. Run an Ethereum node and ipfs 1. Run an Ethereum node and ipfs
@@ -63,26 +50,21 @@ if you want to increase the block time to 10 seconds you can add
$ npm run devchain $ npm run devchain
$ ipfs daemon $ ipfs daemon
2. Compile contracts 2. Deploy each app to the devchain
(compiled contracts will be in `/build`)
$ npm run compile-contracts
3. Deploy each app to the devchain
(make sure you've run `npm install` for every app - see installation) (make sure you've run `npm install` for every app - see installation)
$ npm run deploy:apps $ npm run deploy:apps
4. Deploy a new KreditsKit and create a new DAO with the latest app versions 3. Deploy a new KreditsKit and create a new DAO with the latest app versions
$ npm run deploy:kit $ npm run deploy:kit
$ npm run deploy:dao $ npm run deploy:dao
5. Execute seeds to create demo contributors, contributions, etc. (optional) 4. Execute seeds to create demo contributors, contributons, etc. (optional)
$ npm run seeds $ npm run seeds
**Step 2-5 is also summarized in `npm run bootstrap`** **Step 2-4 is also summarized in `npm run bootstrap`**
If you want to reset your local setup: If you want to reset your local setup:
@@ -170,14 +152,8 @@ Deploys a new KreditsKit that allows to create a new DAO
or or
$ npm run deploy:kit $ npm run deploy:kit
#### Kredits configuration options: `ENS` address is required as environment variable.
`DAO_FACTORY` can optionally be set as environment variable. (see aragon)
Configuration options can be set in an environment specific `kredits` object in the `arapp.json` or using a CLI parameter.
* daoFactory: Ethereum address of the used DAO Factory. On public networks we use [official aragon factories](https://github.com/aragon/deployments/tree/master/environments/)
* apmDomain: the ENS domain of the aragonPM (normally `open.aragonpm.eth`)
(please also see the [arapp.json related configuration options](https://hack.aragon.org/docs/cli-global-confg#the-arappjson-file))
### new-dao.js ### new-dao.js
@@ -187,7 +163,7 @@ Creates and configures a new DAO instance.
or or
$ npm run deploy:dao $ npm run deploy:dao
KreditsKit address is loaded from `lib/addresses/KreditsKit.json` or can be KreditsKit address is load from `lib/addresses/KreditsKit.json` or can be
configured through the `KREDITS_KIT` environment variable. configured through the `KREDITS_KIT` environment variable.
### deploy-apps.sh ### deploy-apps.sh
@@ -222,7 +198,7 @@ make sure all apps and the KreditsKit are deployed, then create a new DAO:
## Upgradeable contracts ## Upgradeable contracts
We use aragonOS for upgradeability of the different contracts. Refer to the We use aragonOS for upgradeablity of the different contracts. Refer to the
[aragonOS upgradeablity documentation](https://hack.aragon.org/docs/upgradeability-intro) [aragonOS upgradeablity documentation](https://hack.aragon.org/docs/upgradeability-intro)
for more details. for more details.

View File

@@ -0,0 +1,912 @@
{
"roles": [
{
"name": "Add contributions",
"id": "ADD_CONTRIBUTION_ROLE",
"params": [],
"bytes": "0x493d28cd0d82bcb20db66e4f6390a00122ef772717e282b436ba3240af18bfb1"
},
{
"name": "Manage token contract",
"id": "MANAGE_TOKEN_CONTRACT_ROLE",
"params": [],
"bytes": "0xdd275187bc43df45ce7b34f6716e572716c69ad44e5e496175008950f032854b"
},
{
"name": "Veto contributions",
"id": "VETO_CONTRIBUTION_ROLE",
"params": [],
"bytes": "0x495a36de1ed34d5c1b9f8704e7d8bc8badb027221b09c79691d430bc54c4c88f"
}
],
"environments": {
"default": {
"network": "development",
"appName": "kredits-contribution.open.aragonpm.eth"
}
},
"path": "contracts/Contribution.sol",
"appName": "kredits-contribution.open.aragonpm.eth",
"appId": "0x09f5274cba299b46c5be722ef672d10eef7a2ef980b612aef529d74fb9da7643",
"abi": [
{
"constant": true,
"inputs": [],
"name": "hasInitialized",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "ADD_CONTRIBUTION_ROLE",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_script",
"type": "bytes"
}
],
"name": "getEVMScriptExecutor",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getRecoveryVault",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "contributionsCount",
"outputs": [
{
"name": "",
"type": "uint32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "token",
"type": "address"
}
],
"name": "allowRecoverability",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "appId",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getInitializationBlock",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "KERNEL_APP_ADDR_NAMESPACE",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_token",
"type": "address"
}
],
"name": "transferToVault",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_sender",
"type": "address"
},
{
"name": "_role",
"type": "bytes32"
},
{
"name": "_params",
"type": "uint256[]"
}
],
"name": "canPerform",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getEVMScriptRegistry",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint32"
}
],
"name": "contributionOwner",
"outputs": [
{
"name": "",
"type": "uint32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint32"
}
],
"name": "contributions",
"outputs": [
{
"name": "contributorId",
"type": "uint32"
},
{
"name": "amount",
"type": "uint32"
},
{
"name": "claimed",
"type": "bool"
},
{
"name": "hashDigest",
"type": "bytes32"
},
{
"name": "hashFunction",
"type": "uint8"
},
{
"name": "hashSize",
"type": "uint8"
},
{
"name": "tokenMetadataURL",
"type": "string"
},
{
"name": "confirmedAtBlock",
"type": "uint256"
},
{
"name": "vetoed",
"type": "bool"
},
{
"name": "exists",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint32"
},
{
"name": "",
"type": "uint256"
}
],
"name": "ownedContributions",
"outputs": [
{
"name": "",
"type": "uint32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "kernel",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "blocksToWait",
"outputs": [
{
"name": "",
"type": "uint32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "isPetrified",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "appIds",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "VETO_CONTRIBUTION_ROLE",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "id",
"type": "uint32"
},
{
"indexed": true,
"name": "contributorId",
"type": "uint32"
},
{
"indexed": false,
"name": "amount",
"type": "uint32"
}
],
"name": "ContributionAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "id",
"type": "uint32"
},
{
"indexed": true,
"name": "contributorId",
"type": "uint32"
},
{
"indexed": false,
"name": "amount",
"type": "uint32"
}
],
"name": "ContributionClaimed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "id",
"type": "uint32"
},
{
"indexed": false,
"name": "vetoedByAccount",
"type": "address"
}
],
"name": "ContributionVetoed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "executor",
"type": "address"
},
{
"indexed": false,
"name": "script",
"type": "bytes"
},
{
"indexed": false,
"name": "input",
"type": "bytes"
},
{
"indexed": false,
"name": "returnData",
"type": "bytes"
}
],
"name": "ScriptResult",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "vault",
"type": "address"
},
{
"indexed": true,
"name": "token",
"type": "address"
},
{
"indexed": false,
"name": "amount",
"type": "uint256"
}
],
"name": "RecoverToVault",
"type": "event"
},
{
"constant": false,
"inputs": [
{
"name": "_appIds",
"type": "bytes32[4]"
}
],
"name": "initialize",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getTokenContract",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getContributorContract",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "contributorAccount",
"type": "address"
}
],
"name": "getContributorIdByAddress",
"outputs": [
{
"name": "",
"type": "uint32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "contributorId",
"type": "uint32"
}
],
"name": "getContributorAddressById",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "name",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "symbol",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "contributionId",
"type": "uint32"
}
],
"name": "ownerOf",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "owner",
"type": "address"
},
{
"name": "index",
"type": "uint32"
}
],
"name": "tokenOfOwnerByIndex",
"outputs": [
{
"name": "",
"type": "uint32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "contributionId",
"type": "uint32"
}
],
"name": "tokenMetadata",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "confirmedOnly",
"type": "bool"
}
],
"name": "totalKreditsEarned",
"outputs": [
{
"name": "amount",
"type": "uint32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "contributorId",
"type": "uint32"
},
{
"name": "confirmedOnly",
"type": "bool"
}
],
"name": "totalKreditsEarnedByContributor",
"outputs": [
{
"name": "amount",
"type": "uint32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "contributionId",
"type": "uint32"
}
],
"name": "getContribution",
"outputs": [
{
"name": "id",
"type": "uint32"
},
{
"name": "contributorId",
"type": "uint32"
},
{
"name": "amount",
"type": "uint32"
},
{
"name": "claimed",
"type": "bool"
},
{
"name": "hashDigest",
"type": "bytes32"
},
{
"name": "hashFunction",
"type": "uint8"
},
{
"name": "hashSize",
"type": "uint8"
},
{
"name": "confirmedAtBlock",
"type": "uint256"
},
{
"name": "exists",
"type": "bool"
},
{
"name": "vetoed",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "amount",
"type": "uint32"
},
{
"name": "contributorId",
"type": "uint32"
},
{
"name": "hashDigest",
"type": "bytes32"
},
{
"name": "hashFunction",
"type": "uint8"
},
{
"name": "hashSize",
"type": "uint8"
}
],
"name": "add",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "contributionId",
"type": "uint32"
}
],
"name": "veto",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "contributionId",
"type": "uint32"
}
],
"name": "claim",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "contributionId",
"type": "uint32"
}
],
"name": "exists",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"deployment": {
"contractName": "Contribution",
"compiledAt": "2019-06-13T12:39:07.659Z",
"compiler": {
"name": "solc",
"version": "0.4.24+commit.e67f0147.Emscripten.clang",
"optimizer": {
"enabled": false
}
},
"flattenedCode": "./code.sol",
"transactionHash": "0x073057bb616243e415823fa9a8c8cc096b573fbd0bbf11c2f59bb75a84291689"
},
"functions": [
{
"sig": "mintFor(address,uint256,uint32)",
"roles": [],
"notice": null
},
{
"sig": "initialize(bytes32[4])",
"roles": [],
"notice": null
},
{
"sig": "add(uint32,uint32,bytes32,uint8,uint8)",
"roles": [
"ADD_CONTRIBUTION_ROLE"
],
"notice": null
},
{
"sig": "veto(uint32)",
"roles": [
"VETO_CONTRIBUTION_ROLE"
],
"notice": null
},
{
"sig": "claim(uint32)",
"roles": [],
"notice": null
}
]
}

1252
apps/contribution/code.sol Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -60,18 +60,23 @@ contract Contribution is AragonApp {
initialized(); initialized();
} }
function getContract(uint8 appId) public view returns (address) { // TODO refactor into a single function
function getTokenContract() public view returns (address) {
IKernel k = IKernel(kernel()); IKernel k = IKernel(kernel());
return k.getApp(KERNEL_APP_ADDR_NAMESPACE, appIds[appId]); return k.getApp(KERNEL_APP_ADDR_NAMESPACE, appIds[uint8(Apps.Token)]);
}
function getContributorContract() public view returns (address) {
IKernel k = IKernel(kernel());
return k.getApp(KERNEL_APP_ADDR_NAMESPACE, appIds[uint8(Apps.Contributor)]);
} }
function getContributorIdByAddress(address contributorAccount) public view returns (uint32) { function getContributorIdByAddress(address contributorAccount) public view returns (uint32) {
address contributor = getContract(uint8(Apps.Contributor)); address contributor = getContributorContract();
return ContributorInterface(contributor).getContributorIdByAddress(contributorAccount); return ContributorInterface(contributor).getContributorIdByAddress(contributorAccount);
} }
function getContributorAddressById(uint32 contributorId) public view returns (address) { function getContributorAddressById(uint32 contributorId) public view returns (address) {
address contributor = getContract(uint8(Apps.Contributor)); address contributor = getContributorContract();
return ContributorInterface(contributor).getContributorAddressById(contributorId); return ContributorInterface(contributor).getContributorAddressById(contributorId);
} }
@@ -193,14 +198,14 @@ contract Contribution is AragonApp {
require(block.number >= c.confirmedAtBlock, 'NOT_CLAIMABLE'); require(block.number >= c.confirmedAtBlock, 'NOT_CLAIMABLE');
c.claimed = true; c.claimed = true;
address token = getContract(uint8(Apps.Token)); address token = getTokenContract();
address contributorAccount = getContributorAddressById(c.contributorId); address contributorAccount = getContributorAddressById(c.contributorId);
uint256 amount = uint256(c.amount); uint256 amount = uint256(c.amount);
IToken(token).mintFor(contributorAccount, amount, contributionId); IToken(token).mintFor(contributorAccount, amount, contributionId);
emit ContributionClaimed(contributionId, c.contributorId, c.amount); emit ContributionClaimed(contributionId, c.contributorId, c.amount);
} }
function exists(uint32 contributionId) public view returns (bool) { function exists(uint32 contributionId) view public returns (bool) {
return contributions[contributionId].exists; return contributions[contributionId].exists;
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -3,19 +3,16 @@
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"dependencies": { "dependencies": {
"@aragon/os": "^4.4.0" "@aragon/os": "^4.2.0",
}, "@aragon/cli": "^5.9.6"
"devDependencies": {
"@aragon/test-helpers": "^2.1.0",
"eth-gas-reporter": "^0.2.17",
"ganache-cli": "^6.9.1",
"solidity-coverage": "^0.5.11"
}, },
"devDependencies": {},
"scripts": { "scripts": {
"start": "npm run start:aragon:ipfs", "start": "npm run start:aragon:ipfs",
"start:aragon:ipfs": "aragon run", "start:aragon:ipfs": "aragon run",
"start:aragon:http": "aragon run --http localhost:8001 --http-served-from ./dist", "start:aragon:http": "aragon run --http localhost:8001 --http-served-from ./dist",
"start:app": "", "start:app": "",
"test": "aragon contracts test",
"compile": "aragon contracts compile", "compile": "aragon contracts compile",
"sync-assets": "", "sync-assets": "",
"build:app": "", "build:app": "",
@@ -24,8 +21,7 @@
"publish:patch": "aragon apm publish patch", "publish:patch": "aragon apm publish patch",
"publish:minor": "aragon apm publish minor", "publish:minor": "aragon apm publish minor",
"publish:major": "aragon apm publish major", "publish:major": "aragon apm publish major",
"versions": "aragon apm versions", "versions": "aragon apm versions"
"test": "truffle test"
}, },
"keywords": [] "keywords": []
} }

8145
apps/contribution/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -41,12 +41,19 @@ contract Contributor is AragonApp {
initialized(); initialized();
} }
function getContract(uint8 appId) public view returns (address) { function getTokenContract() public view returns (address) {
IKernel k = IKernel(kernel()); IKernel k = IKernel(kernel());
return k.getApp(KERNEL_APP_ADDR_NAMESPACE, appIds[appId]);
return k.getApp(KERNEL_APP_ADDR_NAMESPACE, appIds[uint8(Apps.Token)]);
} }
function coreContributorsCount() public view returns (uint32) { function getContributionContract() public view returns (address) {
IKernel k = IKernel(kernel());
return k.getApp(KERNEL_APP_ADDR_NAMESPACE, appIds[uint8(Apps.Contribution)]);
}
function coreContributorsCount() view public returns (uint32) {
uint32 count = 0; uint32 count = 0;
for (uint32 i = 1; i <= contributorsCount; i++) { for (uint32 i = 1; i <= contributorsCount; i++) {
if (isCoreTeam(i)) { if (isCoreTeam(i)) {
@@ -57,13 +64,10 @@ contract Contributor is AragonApp {
} }
function updateContributorAccount(uint32 id, address oldAccount, address newAccount) public auth(MANAGE_CONTRIBUTORS_ROLE) { function updateContributorAccount(uint32 id, address oldAccount, address newAccount) public auth(MANAGE_CONTRIBUTORS_ROLE) {
require(newAccount != address(0), "invalid new account address");
require(getContributorAddressById(id) == oldAccount, "contributor does not exist");
contributorIds[oldAccount] = 0; contributorIds[oldAccount] = 0;
contributorIds[newAccount] = id; contributorIds[newAccount] = id;
contributors[id].account = newAccount; contributors[id].account = newAccount;
emit ContributorAccountUpdated(id, oldAccount, newAccount); ContributorAccountUpdated(id, oldAccount, newAccount);
} }
function updateContributorProfileHash(uint32 id, bytes32 hashDigest, uint8 hashFunction, uint8 hashSize) public isInitialized auth(MANAGE_CONTRIBUTORS_ROLE) { function updateContributorProfileHash(uint32 id, bytes32 hashDigest, uint8 hashFunction, uint8 hashSize) public isInitialized auth(MANAGE_CONTRIBUTORS_ROLE) {
@@ -132,9 +136,9 @@ contract Contributor is AragonApp {
hashFunction = c.hashFunction; hashFunction = c.hashFunction;
hashSize = c.hashSize; hashSize = c.hashSize;
isCore = isCoreTeam(id); isCore = isCoreTeam(id);
address token = getContract(uint8(Apps.Token)); address token = getTokenContract();
balance = ITokenBalance(token).balanceOf(c.account); balance = ITokenBalance(token).balanceOf(c.account);
address contribution = getContract(uint8(Apps.Contribution)); address contribution = getContributionContract();
totalKreditsEarned = IContributionBalance(contribution).totalKreditsEarnedByContributor(_id, true); totalKreditsEarned = IContributionBalance(contribution).totalKreditsEarnedByContributor(_id, true);
contributionsCount = IContributionBalance(contribution).balanceOf(c.account); contributionsCount = IContributionBalance(contribution).balanceOf(c.account);
exists = c.exists; exists = c.exists;

View File

@@ -1,16 +0,0 @@
pragma solidity ^0.4.24;
import "@aragon/os/contracts/acl/ACL.sol";
import "@aragon/os/contracts/kernel/Kernel.sol";
import "@aragon/os/contracts/factory/DAOFactory.sol";
// You might think this file is a bit odd, but let me explain.
// We only use for now those imported contracts in our tests, which
// means Truffle will not compile them for us, because they are from
// an external dependency.
// solium-disable-next-line no-empty-blocks
contract Spoof {
// ...
}

File diff suppressed because it is too large Load Diff

View File

@@ -3,19 +3,16 @@
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"dependencies": { "dependencies": {
"@aragon/os": "^4.4.0" "@aragon/os": "^4.2.0",
}, "@aragon/cli": "^5.9.6"
"devDependencies": {
"@aragon/test-helpers": "^2.1.0",
"eth-gas-reporter": "^0.2.17",
"ganache-cli": "^6.9.1",
"solidity-coverage": "^0.5.11"
}, },
"devDependencies": {},
"scripts": { "scripts": {
"start": "npm run start:aragon:ipfs", "start": "npm run start:aragon:ipfs",
"start:aragon:ipfs": "aragon run", "start:aragon:ipfs": "aragon run",
"start:aragon:http": "aragon run --http localhost:8001 --http-served-from ./dist", "start:aragon:http": "aragon run --http localhost:8001 --http-served-from ./dist",
"start:app": "", "start:app": "",
"test": "aragon contracts test",
"compile": "aragon contracts compile", "compile": "aragon contracts compile",
"sync-assets": "", "sync-assets": "",
"build:app": "", "build:app": "",
@@ -24,8 +21,7 @@
"publish:patch": "aragon apm publish patch", "publish:patch": "aragon apm publish patch",
"publish:minor": "aragon apm publish minor", "publish:minor": "aragon apm publish minor",
"publish:major": "aragon apm publish major", "publish:major": "aragon apm publish major",
"versions": "aragon apm versions", "versions": "aragon apm versions"
"test": "truffle test"
}, },
"keywords": [] "keywords": []
} }

View File

@@ -0,0 +1,5 @@
// const Contributor = artifacts.require('Contributor.sol');
contract('Contributor', (_accounts) => {
it('should be tested');
});

View File

@@ -1,170 +0,0 @@
const namehash = require('ethers').utils.namehash;
// eslint-disable-next-line no-undef
const Contributor = artifacts.require("Contributor.sol");
// eslint-disable-next-line no-undef
const getContract = name => artifacts.require(name);
const { assertRevert } = require('@aragon/test-helpers/assertThrow');
const ZERO_ADDR = '0x0000000000000000000000000000000000000000';
contract('Contributor app', (accounts) => {
let kernelBase, aclBase, daoFactory, r, dao, acl, contributor;
const root = accounts[0];
const member1 = accounts[1];
// eslint-disable-next-line no-undef
before(async () => {
kernelBase = await getContract('Kernel').new(true); // petrify immediately
aclBase = await getContract('ACL').new();
daoFactory = await getContract('DAOFactory').new(kernelBase.address, aclBase.address, ZERO_ADDR);
r = await daoFactory.newDAO(root);
dao = await getContract('Kernel').at(r.logs.filter(l => l.event == 'DeployDAO')[0].args.dao);
acl = await getContract('ACL').at(await dao.acl());
//create dao mamnager permission for coin owner
await acl.createPermission(
root,
dao.address,
await dao.APP_MANAGER_ROLE(),
root,
{ from: root }
);
//get new app instance from DAO
const receipt = await dao.newAppInstance(
'0x1234',
(await Contributor.new()).address,
0x0,
false,
{ from: root }
);
contributor = Contributor.at(
receipt.logs.filter(l => l.event == 'NewAppProxy')[0].args.proxy
);
//apps id
let appsId = [];
appsId[0] = namehash("kredits-contribution");
appsId[1] = namehash("kredits-contributor");
appsId[2] = namehash("kredits-proposal");
appsId[3] = namehash("kredits-token");
//init contributor (app)
await contributor.initialize(root, appsId);
//create manage contributors role
await acl.createPermission(
root,
contributor.address,
await contributor.MANAGE_CONTRIBUTORS_ROLE(),
root,
{ from: root }
);
});
describe("Owner default permissions", async () => {
it('check owner is contributors manager', async () => {
let manageContributorPermission = await acl.hasPermission(root, contributor.address, await contributor.MANAGE_CONTRIBUTORS_ROLE());
// eslint-disable-next-line no-undef
assert.equal(manageContributorPermission, true);
});
});
describe("Add contributor", async () => {
let account = root;
let hashDigest = '0x0';
let hashFunction = 0;
let hashSize = 0;
it("should revert when add contributor from an address that does not have permission", async () => {
return assertRevert(async () => {
await contributor.addContributor(account, hashDigest, hashFunction, hashSize, { from: member1});
'sender does not have permission';
});
});
it('add contributor', async () => {
let contributorCount = await contributor.coreContributorsCount();
await contributor.addContributor(account, hashDigest, hashFunction, hashSize);
// eslint-disable-next-line no-undef
assert.equal(await contributor.addressExists(account), true);
let contributorCountAfter = await contributor.coreContributorsCount();
// eslint-disable-next-line no-undef
assert.equal(await contributorCountAfter.toNumber(), parseInt(contributorCount)+1);
});
it("should revert when add contributor with an address that already exist", async () => {
return assertRevert(async () => {
await contributor.addContributor(account, hashDigest, hashFunction, hashSize, { from: member1});
'address already exist';
});
});
});
describe("Update contributor", async () => {
let id;
let oldAccount;
let newAccount;
let hashDigest;
let hashFunction;
let hashSize;
// eslint-disable-next-line no-undef
before(async () => {
id = await contributor.coreContributorsCount();
oldAccount = root;
newAccount = member1;
hashDigest = '0x1000000000000000000000000000000000000000000000000000000000000000';
hashFunction = 1;
hashSize = 1;
});
it('update contributor account', async () => {
await contributor.updateContributorAccount(id.toNumber(), oldAccount, newAccount);
let contributorId = await contributor.getContributorIdByAddress(oldAccount);
// eslint-disable-next-line no-undef
assert.equal(contributorId.toNumber(), 0);
});
it("should revert when update contributor account from address that does not have permission", async () => {
return assertRevert(async () => {
await contributor.updateContributorAccount(id.toNumber(), oldAccount, newAccount, {from: member1});
'sender does not have permission';
});
});
it("should revert when update contributor account that does not exist", async () => {
return assertRevert(async () => {
await contributor.updateContributorAccount(id.toNumber(), accounts[3], newAccount);
'contributor does not exist';
});
});
it("should revert when update contributor account with address(0)", async () => {
return assertRevert(async () => {
await contributor.updateContributorAccount(id.toNumber(), oldAccount, ZERO_ADDR);
'contributor does not exist';
});
});
it('update contributor profile hash', async () => {
await contributor.updateContributorProfileHash(id.toNumber(), hashDigest, hashFunction, hashSize);
let contributorProfile = await contributor.contributors(id.toNumber());
assert.equal(hashDigest, contributorProfile[1]); // eslint-disable-line no-undef
assert.equal(hashFunction, contributorProfile[2].toNumber()); // eslint-disable-line no-undef
assert.equal(hashSize, contributorProfile[3].toNumber()); // eslint-disable-line no-undef
});
it("should revert when update contributor profile hash from address that does not have permission", async () => {
return assertRevert(async () => {
await contributor.updateContributorProfileHash(id.toNumber(), hashDigest, hashFunction, hashSize, {from: member1});
'sender does not have permission';
});
});
});
});

8145
apps/contributor/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -51,13 +51,16 @@ contract Proposal is AragonApp {
initialized(); initialized();
} }
function getContract(uint8 appId) public view returns (address) { function getContributorContract() public view returns (address) {
IKernel k = IKernel(kernel()); return IKernel(kernel()).getApp(KERNEL_APP_ADDR_NAMESPACE, appIds[uint8(Apps.Contributor)]);
return k.getApp(KERNEL_APP_ADDR_NAMESPACE, appIds[appId]); }
function getContributionContract() public view returns (address) {
return IKernel(kernel()).getApp(KERNEL_APP_ADDR_NAMESPACE, appIds[uint8(Apps.Contribution)]);
} }
function addProposal(uint32 contributorId, uint32 amount, bytes32 hashDigest, uint8 hashFunction, uint8 hashSize) public isInitialized auth(ADD_PROPOSAL_ROLE) { function addProposal(uint32 contributorId, uint32 amount, bytes32 hashDigest, uint8 hashFunction, uint8 hashSize) public isInitialized auth(ADD_PROPOSAL_ROLE) {
require(IContributor(getContract(uint8(Apps.Contributor))).exists(contributorId), 'CONTRIBUTOR_NOT_FOUND'); require(IContributor(getContributorContract()).exists(contributorId), 'CONTRIBUTOR_NOT_FOUND');
uint32 proposalId = proposalsCount + 1; uint32 proposalId = proposalsCount + 1;
uint16 _votesNeeded = 1; //contributorsContract().coreContributorsCount() / 100 * 75; uint16 _votesNeeded = 1; //contributorsContract().coreContributorsCount() / 100 * 75;
@@ -99,7 +102,7 @@ contract Proposal is AragonApp {
function vote(uint32 proposalId) public isInitialized auth(VOTE_PROPOSAL_ROLE) { function vote(uint32 proposalId) public isInitialized auth(VOTE_PROPOSAL_ROLE) {
Proposal storage p = proposals[proposalId]; Proposal storage p = proposals[proposalId];
require(!p.executed, 'ALREADY_EXECUTED'); require(!p.executed, 'ALREADY_EXECUTED');
uint32 voterId = IContributor(getContract(uint8(Apps.Contributor))).getContributorIdByAddress(msg.sender); uint32 voterId = IContributor(getContributorContract()).getContributorIdByAddress(msg.sender);
require(p.votes[voterId] != true, 'ALREADY_VOTED'); require(p.votes[voterId] != true, 'ALREADY_VOTED');
p.voterIds.push(voterId); p.voterIds.push(voterId);
p.votes[voterId] = true; p.votes[voterId] = true;
@@ -123,7 +126,7 @@ contract Proposal is AragonApp {
require(p.votesCount >= p.votesNeeded, 'MISSING_VOTES'); require(p.votesCount >= p.votesNeeded, 'MISSING_VOTES');
p.executed = true; p.executed = true;
IContribution(getContract(uint8(Apps.Contribution))).add(p.amount, p.contributorId, p.hashDigest, p.hashFunction, p.hashSize); IContribution(getContributionContract()).add(p.amount, p.contributorId, p.hashDigest, p.hashFunction, p.hashSize);
emit ProposalExecuted(proposalId, p.contributorId, p.amount); emit ProposalExecuted(proposalId, p.contributorId, p.amount);
} }

File diff suppressed because it is too large Load Diff

View File

@@ -3,19 +3,16 @@
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"dependencies": { "dependencies": {
"@aragon/os": "^4.4.0" "@aragon/os": "^4.2.0",
}, "@aragon/cli": "^5.9.6"
"devDependencies": {
"@aragon/test-helpers": "^2.1.0",
"eth-gas-reporter": "^0.2.17",
"ganache-cli": "^6.9.1",
"solidity-coverage": "^0.5.11"
}, },
"devDependencies": {},
"scripts": { "scripts": {
"start": "npm run start:aragon:ipfs", "start": "npm run start:aragon:ipfs",
"start:aragon:ipfs": "aragon run", "start:aragon:ipfs": "aragon run",
"start:aragon:http": "aragon run --http localhost:8001 --http-served-from ./dist", "start:aragon:http": "aragon run --http localhost:8001 --http-served-from ./dist",
"start:app": "", "start:app": "",
"test": "aragon contracts test",
"compile": "aragon contracts compile", "compile": "aragon contracts compile",
"sync-assets": "", "sync-assets": "",
"build:app": "", "build:app": "",
@@ -24,8 +21,7 @@
"publish:patch": "aragon apm publish patch", "publish:patch": "aragon apm publish patch",
"publish:minor": "aragon apm publish minor", "publish:minor": "aragon apm publish minor",
"publish:major": "aragon apm publish major", "publish:major": "aragon apm publish major",
"versions": "aragon apm versions", "versions": "aragon apm versions"
"test": "truffle test"
}, },
"keywords": [] "keywords": []
} }

8145
apps/proposal/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -21,8 +21,6 @@ contract Token is ERC20Token, AragonApp {
} }
function mintFor(address contributorAccount, uint256 amount, uint32 contributionId) public isInitialized auth(MINT_TOKEN_ROLE) { function mintFor(address contributorAccount, uint256 amount, uint32 contributionId) public isInitialized auth(MINT_TOKEN_ROLE) {
require(amount > 0, "INVALID_AMOUNT");
uint256 amountInWei = amount.mul(1 ether); uint256 amountInWei = amount.mul(1 ether);
_mint(contributorAccount, amountInWei); _mint(contributorAccount, amountInWei);
emit LogMint(contributorAccount, amount, contributionId); emit LogMint(contributorAccount, amount, contributionId);

View File

@@ -1,16 +0,0 @@
pragma solidity ^0.4.24;
import "@aragon/os/contracts/acl/ACL.sol";
import "@aragon/os/contracts/kernel/Kernel.sol";
import "@aragon/os/contracts/factory/DAOFactory.sol";
// You might think this file is a bit odd, but let me explain.
// We only use for now those imported contracts in our tests, which
// means Truffle will not compile them for us, because they are from
// an external dependency.
// solium-disable-next-line no-empty-blocks
contract Spoof {
// ...
}

File diff suppressed because it is too large Load Diff

View File

@@ -3,19 +3,16 @@
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"dependencies": { "dependencies": {
"@aragon/os": "^4.4.0" "@aragon/os": "^4.2.0",
}, "@aragon/cli": "^5.9.6"
"devDependencies": {
"@aragon/test-helpers": "^2.1.0",
"eth-gas-reporter": "^0.2.17",
"ganache-cli": "^6.9.1",
"solidity-coverage": "^0.5.11"
}, },
"devDependencies": {},
"scripts": { "scripts": {
"start": "npm run start:aragon:ipfs", "start": "npm run start:aragon:ipfs",
"start:aragon:ipfs": "aragon run", "start:aragon:ipfs": "aragon run",
"start:aragon:http": "aragon run --http localhost:8001 --http-served-from ./dist", "start:aragon:http": "aragon run --http localhost:8001 --http-served-from ./dist",
"start:app": "", "start:app": "",
"test": "aragon contracts test",
"compile": "aragon contracts compile", "compile": "aragon contracts compile",
"sync-assets": "", "sync-assets": "",
"build:app": "", "build:app": "",
@@ -24,8 +21,7 @@
"publish:patch": "aragon apm publish patch", "publish:patch": "aragon apm publish patch",
"publish:minor": "aragon apm publish minor", "publish:minor": "aragon apm publish minor",
"publish:major": "aragon apm publish major", "publish:major": "aragon apm publish major",
"versions": "aragon apm versions", "versions": "aragon apm versions"
"test": "truffle test"
}, },
"keywords": [] "keywords": []
} }

5
apps/token/test/app.js Normal file
View File

@@ -0,0 +1,5 @@
// const Token = artifacts.require('Token.sol');
contract('Token', (_accounts) => {
it('should be tested');
});

View File

@@ -1,123 +0,0 @@
const namehash = require('ethers').utils.namehash;
// eslint-disable-next-line no-undef
const Token = artifacts.require("Token.sol");
// eslint-disable-next-line no-undef
const getContract = name => artifacts.require(name);
const { assertRevert } = require('@aragon/test-helpers/assertThrow');
const ZERO_ADDR = '0x0000000000000000000000000000000000000000';
contract('Token app', (accounts) => {
let kernelBase, aclBase, daoFactory, dao, r, acl, token;
const root = accounts[0];
const member1 = accounts[1];
// eslint-disable-next-line no-undef
before(async () => {
kernelBase = await getContract('Kernel').new(true); // petrify immediately
aclBase = await getContract('ACL').new();
daoFactory = await getContract('DAOFactory').new(kernelBase.address, aclBase.address, ZERO_ADDR);
r = await daoFactory.newDAO(root);
dao = await getContract('Kernel').at(r.logs.filter(l => l.event == 'DeployDAO')[0].args.dao);
acl = await getContract('ACL').at(await dao.acl());
//create dao mamnager permission for coin owner
await acl.createPermission(
root,
dao.address,
await dao.APP_MANAGER_ROLE(),
root,
{ from: root }
);
//get new app instance from DAO
const receipt = await dao.newAppInstance(
'0x1234',
(await Token.new()).address,
0x0,
false,
{ from: root }
);
token = Token.at(
receipt.logs.filter(l => l.event == 'NewAppProxy')[0].args.proxy
);
//apps id
let appsId = [];
appsId[0] = namehash("kredits-contribution");
appsId[1] = namehash("kredits-contributor");
appsId[2] = namehash("kredits-proposal");
appsId[3] = namehash("kredits-token");
//init token (app)
await token.initialize(appsId);
//create token mint permission for coin owner
await acl.createPermission(
root,
token.address,
await token.MINT_TOKEN_ROLE(),
root,
{ from: root }
);
});
describe("Owner default space permissions", async () => {
it('check owner is token issuer', async () => {
let tokenIssuerPermission = await acl.hasPermission(root, token.address, await token.MINT_TOKEN_ROLE());
// eslint-disable-next-line no-undef
assert.equal(tokenIssuerPermission, true);
});
});
describe("Token issuing", async () => {
let name = "Kredits";
let symbol = "₭S";
let decimals = 18;
it("check token properties", async () => {
assert.equal(await token.name(), name); // eslint-disable-line no-undef
assert.equal(await token.symbol(), symbol); // eslint-disable-line no-undef
assert.equal(await token.decimals(), decimals); // eslint-disable-line no-undef
});
});
describe("Token minting", async () => {
let tokenToMint = 250;
let ether = 1000000000000000000;
it("should revert when mint tokens from an address that does not have minting permission", async () => {
return assertRevert(async () => {
await token.mintFor(root, tokenToMint, 1, { from: member1});
'address does not have permission to mint tokens';
});
});
it("should revert when mint tokens to address(0)", async () => {
return assertRevert(async () => {
await token.mintFor(ZERO_ADDR, tokenToMint, 1, { from: root});
'invalid contributor address';
});
});
it("should revert when mint amount of tokens equal to 0", async () => {
return assertRevert(async () => {
await token.mintFor(root, 0, 1, { from: root});
'amount to mint should be greater than zero';
});
});
it("mint tokens", async () => {
await token.mintFor(root, tokenToMint, 1, { from: root });
let ownerBalance = await token.balanceOf(root);
let totalSupply = await token.totalSupply();
assert.equal(ownerBalance.toNumber(), tokenToMint*ether); // eslint-disable-line no-undef
assert.equal(totalSupply.toNumber(), tokenToMint*ether); // eslint-disable-line no-undef
});
});
});

8145
apps/token/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -34,6 +34,7 @@
"environments": { "environments": {
"development": { "development": {
"network": "development", "network": "development",
"apm": "open.aragonpm.eth",
"registry": "0x5f6f7e8cc7346a11ca2def8f827b7a0b612c56a1", "registry": "0x5f6f7e8cc7346a11ca2def8f827b7a0b612c56a1",
"appName": "dummy.open.aragonpm.eth" "appName": "dummy.open.aragonpm.eth"
}, },
@@ -41,10 +42,9 @@
"network": "rinkeby", "network": "rinkeby",
"registry": "0x98Df287B6C145399Aaa709692c8D308357bC085D", "registry": "0x98Df287B6C145399Aaa709692c8D308357bC085D",
"wsRPC": "wss://rinkeby.eth.aragon.network/ws", "wsRPC": "wss://rinkeby.eth.aragon.network/ws",
"daoFactory": "0x2298d27a9b847c681d2b2c2828ab9d79013f5f1d",
"appName": "dummy.open.aragonpm.eth", "appName": "dummy.open.aragonpm.eth",
"kredits": { "apm": "open.aragonpm.eth"
"daoFactory": "0x2298d27a9b847c681d2b2c2828ab9d79013f5f1d"
}
}, },
"kovan": { "kovan": {
"network": "kovan", "network": "kovan",
@@ -52,7 +52,8 @@
}, },
"default": { "default": {
"network": "development", "network": "development",
"appName": "dummy.aragonpm.eth" "appName": "dummy.aragonpm.eth",
"apm": "open.aragonpm.eth"
} }
}, },
"path": "contracts/misc/DummyApp.sol" "path": "contracts/misc/DummyApp.sol"

View File

@@ -5,7 +5,7 @@ class Acl extends Base {
hasPermission (fromAddress, contractAddress, roleID, params = null) { hasPermission (fromAddress, contractAddress, roleID, params = null) {
let roleHash = EthersUtils.keccak256(EthersUtils.toUtf8Bytes(roleID)); let roleHash = EthersUtils.keccak256(EthersUtils.toUtf8Bytes(roleID));
return this.hasPermission( return this.functions.hasPermission(
fromAddress, fromAddress,
contractAddress, contractAddress,
roleHash, roleHash,

View File

@@ -1,13 +1,10 @@
const deprecate = require('../utils/deprecate');
class Base { class Base {
constructor (contract) { constructor (contract) {
this.contract = contract; this.contract = contract;
} }
get functions () { get functions () {
deprecate('The property `functions` is deprecated. contract functions are now directly defined on the ethers contract object. https://github.com/ethers-io/ethers.js/issues/920#issuecomment-650836642'); return this.contract.functions;
return this.contract;
} }
get address () { get address () {

View File

@@ -4,33 +4,29 @@ const deprecate = require('../utils/deprecate');
class Contribution extends Record { class Contribution extends Record {
get count () { get count () {
return this.contract.contributionsCount(); return this.functions.contributionsCount();
} }
getById (id) { getById (id) {
return this.contract.getContribution(id) return this.functions.getContribution(id)
.then(data => { .then(data => {
return this.ipfs.catAndMerge(data, ContributionSerializer.deserialize); return this.ipfs.catAndMerge(data, ContributionSerializer.deserialize);
}); });
} }
getData (id) {
return this.contract.getContribution(id);
}
getByContributorId (contributorId) { getByContributorId (contributorId) {
return this.contract.getContributorAddressById(contributorId) return this.functions.getContributorAddressById(contributorId)
.then(address => this.getByContributorAddress(address)); .then(address => this.getByContributorAddress(address));
} }
getByContributorAddress (address) { getByContributorAddress (address) {
return this.contract.balanceOf(address) return this.functions.balanceOf(address)
.then(async (balance) => { .then(async (balance) => {
const count = balance.toNumber(); const count = balance.toNumber();
const contributions = []; const contributions = [];
for (let index = 0; index < count; index++) { for (let index = 0; index < count; index++) {
const id = await this.contract.tokenOfOwnerByIndex(address, index); const id = await this.functions.tokenOfOwnerByIndex(address, index);
const contribution = await this.getById(id); const contribution = await this.getById(id);
contributions.push(contribution); contributions.push(contribution);
} }
@@ -58,7 +54,7 @@ class Contribution extends Record {
ipfsHashAttr.hashSize, ipfsHashAttr.hashSize,
]; ];
return this.contract.add(...contribution, callOptions); return this.functions.add(...contribution, callOptions);
}); });
} }
@@ -66,7 +62,6 @@ class Contribution extends Record {
deprecate('The function `addContribution()` is deprecated and will be removed in the next major version. Use `add()` instead'); deprecate('The function `addContribution()` is deprecated and will be removed in the next major version. Use `add()` instead');
return this.add(...arguments); return this.add(...arguments);
} }
} }
module.exports = Contribution; module.exports = Contribution;

View File

@@ -4,22 +4,17 @@ const formatKredits = require('../utils/format-kredits');
class Contributor extends Record { class Contributor extends Record {
get count () { get count () {
return this.contract.contributorsCount(); return this.functions.contributorsCount();
} }
getById (id) { getById (id) {
return this.contract.getContributorById(id) return this.functions.getContributorById(id)
.then(contractData => { .then(data => {
let data = {...contractData};
data.balanceInt = formatKredits(data.balance); data.balanceInt = formatKredits(data.balance);
return this.ipfs.catAndMerge(data, ContributorSerializer.deserialize); return this.ipfs.catAndMerge(data, ContributorSerializer.deserialize);
}); });
} }
getData (id) {
return this.contract.getContributorById(id);
}
filterByAccount (search) { filterByAccount (search) {
return this._byAccount(search, 'filter'); return this._byAccount(search, 'filter');
} }
@@ -62,7 +57,7 @@ class Contributor extends Record {
ipfsHashAttr.hashSize, ipfsHashAttr.hashSize,
]; ];
return this.contract.addContributor(...contributor, callOptions); return this.functions.addContributor(...contributor, callOptions);
}); });
} }
@@ -79,7 +74,7 @@ class Contributor extends Record {
return this.ipfs return this.ipfs
.add(jsonStr) .add(jsonStr)
.then(ipfsHashAttr => { .then(ipfsHashAttr => {
return this.contract.updateContributorProfileHash( return this.functions.updateContributorProfileHash(
contributorId, contributorId,
ipfsHashAttr.hashDigest, ipfsHashAttr.hashDigest,
ipfsHashAttr.hashFunction, ipfsHashAttr.hashFunction,
@@ -89,7 +84,6 @@ class Contributor extends Record {
}); });
}); });
} }
} }
module.exports = Contributor; module.exports = Contributor;

View File

@@ -11,9 +11,9 @@ class Kernel extends Base {
getApp (appName) { getApp (appName) {
if (appName === 'Acl') { if (appName === 'Acl') {
return this.contract.acl(); return this.functions.acl();
} }
return this.contract.getApp(KERNEL_APP_ADDR_NAMESPACE, this.appNamehash(appName)); return this.functions.getApp(KERNEL_APP_ADDR_NAMESPACE, this.appNamehash(appName));
} }
appNamehash (appName) { appNamehash (appName) {

View File

@@ -4,11 +4,11 @@ const deprecate = require('../utils/deprecate');
class Proposal extends Record { class Proposal extends Record {
get count () { get count () {
return this.contract.proposalsCount(); return this.functions.proposalsCount();
} }
getById (id) { getById (id) {
return this.contract.getProposal(id) return this.functions.getProposal(id)
.then(data => { .then(data => {
return this.ipfs.catAndMerge(data, ContributionSerializer.deserialize); return this.ipfs.catAndMerge(data, ContributionSerializer.deserialize);
}); });
@@ -33,7 +33,7 @@ class Proposal extends Record {
ipfsHashAttr.hashSize, ipfsHashAttr.hashSize,
]; ];
return this.contract.addProposal(...proposal, callOptions); return this.functions.addProposal(...proposal, callOptions);
}); });
} }

View File

@@ -30,11 +30,11 @@ class KreditsKit {
appIdFor (contractName) { appIdFor (contractName) {
// see appIds in KreditsKit.sol for more details // see appIds in KreditsKit.sol for more details
const knownContracts = ['Contribution', 'Contributor', 'Proposal', 'Token']; const knownContracts = ['Contribution', 'Contributor', 'Proposal', 'Token'];
return this.contract.appIds(knownContracts.indexOf(contractName)); return this.contract.functions.appIds(knownContracts.indexOf(contractName));
} }
newDAO (options = {}) { newDAO (options = {}) {
return this.contract.newInstance(options).then(transaction => { return this.contract.functions.newInstance(options).then(transaction => {
return transaction.wait().then(result => { return transaction.wait().then(result => {
const deployEvent = result.events.find(e => e.event === 'DeployInstance'); const deployEvent = result.events.find(e => e.event === 'DeployInstance');
return { return {

View File

@@ -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,
}; };
} }

View File

@@ -1,18 +1,16 @@
const ipfsClient = require('ipfs-http-client'); const ipfsClient = require('ipfs-http-client');
const multihashes = require('multihashes'); const multihashes = require('multihashes');
const fetch = require('node-fetch');
class IPFS { class IPFS {
constructor (config) { constructor (config) {
if (!config) { if (!config) {
config = { host: 'localhost', port: '5001', protocol: 'http' }; config = { host: 'localhost', port: '5001', protocol: 'http' };
} }
this._config = config;
this._ipfsAPI = ipfsClient(config); this._ipfsAPI = ipfsClient(config);
this._config = config;
} }
catAndMerge (contractData, deserialize) { catAndMerge (data, deserialize) {
let data = {...contractData}; // data from ethers.js is not extensible. this copy the attributes in a new object
// if no hash details are found simply return the data; nothing to merge // if no hash details are found simply return the data; nothing to merge
if (!data.hashSize || data.hashSize === 0) { if (!data.hashSize || data.hashSize === 0) {
return data; return data;
@@ -37,23 +35,11 @@ class IPFS {
cat (hashData) { cat (hashData) {
let ipfsHash = hashData; // default - if it is a string let ipfsHash = hashData; // default - if it is a string
if (Object.prototype.hasOwnProperty.call(hashData, 'hashSize')) { if (hashData.hasOwnProperty('hashSize')) {
ipfsHash = this.encodeHash(hashData); ipfsHash = this.encodeHash(hashData);
} }
if (this._config['gatewayUrl']) {
return fetch(`${this._config['gatewayUrl']}/${ipfsHash}`).then(r => r.text());
} else {
return this._ipfsAPI.cat(ipfsHash); return this._ipfsAPI.cat(ipfsHash);
} }
}
pin (hashData) {
let ipfsHash = hashData; // default - if it is a string
if (Object.prototype.hasOwnProperty.call(hashData, 'hashSize')) {
ipfsHash = this.encodeHash(hashData);
}
return this._ipfsAPI.pin.add(multihashes.toB58String(ipfsHash));
}
decodeHash (ipfsHash) { decodeHash (ipfsHash) {
let multihash = multihashes.decode(multihashes.fromB58String(ipfsHash)); let multihash = multihashes.decode(multihashes.fromB58String(ipfsHash));

31753
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "kredits-contracts", "name": "kredits-contracts",
"version": "6.0.0", "version": "5.3.0",
"description": "Ethereum contracts and npm wrapper for Kredits", "description": "Ethereum contracts and npm wrapper for Kredits",
"main": "./lib/kredits.js", "main": "./lib/kredits.js",
"directories": { "directories": {
@@ -12,23 +12,19 @@
"build-json": "npm run compile-contracts && node ./scripts/build-json.js", "build-json": "npm run compile-contracts && node ./scripts/build-json.js",
"repl": "truffle exec scripts/repl.js", "repl": "truffle exec scripts/repl.js",
"seeds": "truffle exec scripts/seeds.js", "seeds": "truffle exec scripts/seeds.js",
"compile-contracts": "truffle compile --all", "compile-contracts": "aragon contracts compile --all",
"bootstrap": "npm run reset:hard && npm run seeds", "bootstrap": "npm run reset:hard && npm run seeds",
"reset": "npm run deploy:kit && npm run deploy:dao", "reset": "npm run deploy:kit && npm run deploy:dao",
"reset:hard": "npm run compile-contracts && npm run deploy:apps && npm run reset", "reset:hard": "npm run deploy:apps && npm run reset",
"deploy:kit": "truffle exec scripts/deploy-kit.js", "deploy:kit": "npm run compile-contracts && aragon contracts exec scripts/deploy-kit.js",
"deploy:dao": "truffle exec scripts/new-dao.js", "deploy:dao": "aragon contracts exec scripts/new-dao.js",
"deploy:apps": "./scripts/every-app.sh \"aragon apm publish major --propagate-content=false --build=false --prepublish=false --skip-confirmation\"", "deploy:apps": "./scripts/every-app.sh \"aragon apm publish major\"",
"devchain": "aragon devchain --port 7545", "devchain": "aragon devchain --port 7545",
"dao:address": "truffle exec scripts/current-address.js", "dao:address": "truffle exec scripts/current-address.js",
"lint:contracts": "solhint \"contracts/**/*.sol\" \"apps/*/contracts/**/*.sol\"", "lint:contracts": "solhint \"contracts/**/*.sol\" \"apps/*/contracts/**/*.sol\"",
"lint:contract-tests": "eslint apps/*/test", "lint:contract-tests": "eslint apps/*/test",
"lint:wrapper": "eslint lib/", "lint:wrapper": "eslint lib/",
"test": "npm run test:token && npm run test:contributor && npm run test:contribution && npm run test:proposal", "test": "echo \"Error: no test specified\" && exit 1",
"test:token": "cd apps/token && npm run test",
"test:contributor": "cd apps/contributor && npm run test",
"test:contribution": "cd apps/contribution && npm run test",
"test:proposal": "cd apps/proposal && npm run test",
"setup-git-hooks": "sh scripts/git-hooks/install" "setup-git-hooks": "sh scripts/git-hooks/install"
}, },
"repository": { "repository": {
@@ -42,28 +38,25 @@
}, },
"homepage": "https://github.com/67P/truffle-kredits#readme", "homepage": "https://github.com/67P/truffle-kredits#readme",
"devDependencies": { "devDependencies": {
"@aragon/cli": "^5.9.6",
"@aragon/kits-base": "^1.0.0", "@aragon/kits-base": "^1.0.0",
"@aragon/os": "^4.4.0", "@aragon/os": "^4.2.0",
"async-each-series": "^1.1.0", "async-each-series": "^1.1.0",
"cli-table": "^0.3.1", "cli-table": "^0.3.1",
"eslint": "^7.1.0", "eslint": "^5.16.0",
"eslint-plugin-import": "^2.20.2", "eslint-plugin-import": "^2.17.3",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^8.0.1",
"eslint-plugin-promise": "^4.2.1", "eslint-plugin-promise": "^4.1.1",
"eth-provider": "^0.2.5", "eth-provider": "^0.2.2",
"homedir": "^0.6.0",
"promptly": "^3.0.3", "promptly": "^3.0.3",
"solc": "^0.6.8", "solc": "^0.4.26",
"solhint": "^2.3.1", "solhint": "^2.1.0",
"truffle-hdwallet-provider": "^1.0.17", "yargs": "^12.0.0"
"truffle-hdwallet-provider-privkey": "^0.3.0",
"yargs": "^15.0.0"
}, },
"dependencies": { "dependencies": {
"ethers": "^5.0.2", "ethers": "^4.0.29",
"ipfs-http-client": "^41.0.1", "ipfs-http-client": "^32.0.1",
"kosmos-schemas": "^2.2.1", "kosmos-schemas": "^2.1.0",
"node-fetch": "^2.6.0",
"tv4": "^1.3.0" "tv4": "^1.3.0"
}, },
"keywords": [ "keywords": [

View File

@@ -19,10 +19,10 @@ module.exports = async function(callback) {
let contributorAccount; let contributorAccount;
if (contributor.length < 5) { if (contributor.length < 5) {
contributorId = contributor; contributorId = contributor;
contributorAccount = await kredits.Contributor.contract.getContributorAddressById(contributor); contributorAccount = await kredits.Contributor.functions.getContributorAddressById(contributor);
} else { } else {
contributorAccount = contributor; contributorAccount = contributor;
contributorId = await kredits.Contributor.contract.getContributorIdByAddress(contributor); contributorId = await kredits.Contributor.functions.getContributorIdByAddress(contributor);
} }
console.log(`Creating a contribution for contributor account ${contributorAccount} ID: ${contributorId}`); console.log(`Creating a contribution for contributor account ${contributorAccount} ID: ${contributorId}`);
@@ -45,7 +45,7 @@ module.exports = async function(callback) {
console.log("\nAdding contribution:"); console.log("\nAdding contribution:");
console.log(contributionAttributes); console.log(contributionAttributes);
kredits.Contribution.add(contributionAttributes, { gasLimit: 300000 }) kredits.Contribution.addContribution(contributionAttributes, { gasLimit: 300000 })
.then(result => { .then(result => {
console.log("\n\nResult:"); console.log("\n\nResult:");
console.log(result); console.log(result);

View File

@@ -19,10 +19,10 @@ module.exports = async function(callback) {
let contributorAccount; let contributorAccount;
if (contributor.length < 5) { if (contributor.length < 5) {
contributorId = contributor; contributorId = contributor;
contributorAccount = await kredits.Contributor.contract.getContributorAddressById(contributor); contributorAccount = await kredits.Contributor.functions.getContributorAddressById(contributor);
} else { } else {
contributorAccount = contributor; contributorAccount = contributor;
contributorId = await kredits.Contributor.contract.getContributorIdByAddress(contributor); contributorId = await kredits.Contributor.functions.getContributorIdByAddress(contributor);
} }
console.log(`Creating a proposal for contributor ID #${contributorId} account: ${contributorAccount}`); console.log(`Creating a proposal for contributor ID #${contributorId} account: ${contributorAccount}`);

View File

@@ -31,7 +31,7 @@ module.exports = async function(callback) {
if (c.contributorId === recipient && confirmed && !c.vetoed && !c.claimed) { if (c.contributorId === recipient && confirmed && !c.vetoed && !c.claimed) {
console.log(`Claiming contribution ID=${c.id}`); console.log(`Claiming contribution ID=${c.id}`);
return kredits.Contribution.contract.claim(c.id, { gasLimit: 500000 }).then(tx => { return kredits.Contribution.functions.claim(c.id, { gasLimit: 500000 }).then(tx => {
table.push([ table.push([
c.id.toString(), c.id.toString(),
`${c.description}`, `${c.description}`,

View File

@@ -17,7 +17,7 @@ module.exports = async function(callback) {
method = await promptly.prompt('Function: '); method = await promptly.prompt('Function: ');
} }
if (!contractWrapper[method] && !contractWrapper.contract[method]) { if (!contractWrapper[method] && !contractWrapper.functions[method]) {
callback(new Error(`Method ${method} is not defined on ${contractName}`)); callback(new Error(`Method ${method} is not defined on ${contractName}`));
return; return;
} }
@@ -33,7 +33,7 @@ module.exports = async function(callback) {
if (contractWrapper[method]) { if (contractWrapper[method]) {
func = contractWrapper[method]; func = contractWrapper[method];
} else { } else {
func = contractWrapper.contract[method]; func = contractWrapper.functions[method];
} }
func.apply(contractWrapper, args).then((result) => { func.apply(contractWrapper, args).then((result) => {
console.log("\nResult:"); console.log("\nResult:");

View File

@@ -1,12 +1,9 @@
const knownDAOAddresses = require('../lib/addresses/dao.json'); const knownDAOAddresses = require('../lib/addresses/dao.json');
const knownKreditsKitAddresses = require('../lib/addresses/KreditsKit.json'); const knownKreditsKitAddresses = require('../lib/addresses/KreditsKit.json');
const getNetworkId = require('./helpers/networkid.js') const getNetworkId = require('./helpers/networkid.js')
const ethers = require('ethers');
module.exports = async function(callback) { module.exports = async function(callback) {
const provider = new ethers.providers.Web3Provider(web3.currentProvider); const networkId = await getNetworkId(web3)
let network = await provider.getNetwork();
let networkId = network.chainId;
console.log('# All known DAO addresses'); console.log('# All known DAO addresses');
Object.keys(knownDAOAddresses).forEach((networkId) => { Object.keys(knownDAOAddresses).forEach((networkId) => {

View File

@@ -3,33 +3,23 @@ const deployDAOFactory = require('@aragon/os/scripts/deploy-daofactory.js')
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const argv = require('yargs').argv const argv = require('yargs').argv
const ethers = require('ethers'); const namehash = require('ethers').utils.namehash;
const namehash = ethers.utils.namehash;
const fileInject = require('./helpers/file_inject.js') const fileInject = require('./helpers/file_inject.js')
const getNetworkId = require('./helpers/networkid.js')
const DAOFactory = artifacts.require('DAOFactory') const DAOFactory = artifacts.require('DAOFactory')
const KreditsKit = artifacts.require('KreditsKit') const KreditsKit = artifacts.require('KreditsKit')
const arapp = require('../arapp.json') const arapp = require('../arapp.json')
const environment = argv['network'] || argv['environment'] || 'development' const environment = argv['network'] || argv['environment'] || 'development'
const apm = arapp.environments[environment].apm
const ensAddr = arapp.environments[environment].registry || process.env.ENS
const daoFactoryAddress = arapp.environments[environment].daoFactory || process.env.DAO_FACTORY
const kreditsArappConfig = arapp.environments[environment].kredits || {}
// typically we use the open.aragonpm.eth aragonpm.
const apm = kreditsArappConfig.apmDomain || argv['apmDomain'] || 'open.aragonpm.eth'
// daoFactory is environment specific.
// See https://github.com/aragon/deployments/tree/master/environments/ for the official daoFactory
// Locally we deploy our own daoFactory and no daoFactory is required (`daoFactoryAddress` is null).
const daoFactoryAddress = kreditsArappConfig.daoFactory || argv['daoFactory']
const ensAddr = arapp.environments[environment].registry || argv['ensAddress']
module.exports = async function(callback) { module.exports = async function(callback) {
const provider = new ethers.providers.Web3Provider(web3.currentProvider); const networkId = await getNetworkId(web3)
const network = await provider.getNetwork();
const networkId = network.chainId;
console.log(`Deploying to networkId: ${networkId}`) console.log(`Deploying to networkId: ${networkId}`)
if (!ensAddr) { if (!ensAddr) {

View File

@@ -1,5 +1,6 @@
const argv = require('yargs').argv; const argv = require('yargs').argv;
const ethers = require('ethers'); const ethers = require('ethers');
const getNetworkId = require('./networkid.js');
const Kredits = require('../../lib/kredits'); const Kredits = require('../../lib/kredits');
const arapp = require('../../arapp.json'); const arapp = require('../../arapp.json');
@@ -9,7 +10,7 @@ const apm = arapp.environments[environment].apm;
module.exports = async function(web3) { module.exports = async function(web3) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const provider = new ethers.providers.Web3Provider(web3.currentProvider); const provider = new ethers.providers.Web3Provider(web3.currentProvider);
const signer = provider.getSigner(); let signer = provider.getSigner();
// checking if siner supports signing transactions // checking if siner supports signing transactions
signer.getAddress().then(_ => { signer.getAddress().then(_ => {
new Kredits(provider, signer, { apm }).init().then(kredits => { new Kredits(provider, signer, { apm }).init().then(kredits => {

View File

@@ -0,0 +1,17 @@
module.exports = function(web3) {
return new Promise((resolve, reject) => {
let func;
if (web3.version.getNetwork) {
func = web3.version.getNetwork;
} else {
func = web3.eth.net.getId;
}
func((err, network) => {
if (err) {
reject(err);
} else {
resolve(network);
}
})
})
}

View File

@@ -1,14 +1,12 @@
const fs = require('fs'); const fs = require('fs');
const ethers = require('ethers'); const getNetworkId = require('./networkid.js');
module.exports = async function(callback) { module.exports = async function(callback) {
const daoAddressPath = 'lib/addresses/dao.json'; const daoAddressPath = 'lib/addresses/dao.json';
// TODO maybe do the same for KreditsKit address file // TODO maybe do the same for KreditsKit address file
try { try {
const provider = new ethers.providers.Web3Provider(web3.currentProvider); const networkId = await getNetworkId(web3);
const network = await provider.getNetwork();
const networkId = network.chainId;
const daoAddresses = JSON.parse(fs.readFileSync(daoAddressPath)); const daoAddresses = JSON.parse(fs.readFileSync(daoAddressPath));
const oldNetworkId = Math.max(...Object.keys(daoAddresses).map(a => parseInt(a))); const oldNetworkId = Math.max(...Object.keys(daoAddresses).map(a => parseInt(a)));
const localDaoAddress = daoAddresses[oldNetworkId]; const localDaoAddress = daoAddresses[oldNetworkId];

View File

@@ -41,8 +41,8 @@ module.exports = async function(callback) {
console.log(table.toString()); console.log(table.toString());
let totalKreditsEarnedUnConfirmed = await kredits.Contribution.contract.totalKreditsEarned(false); let totalKreditsEarnedUnConfirmed = await kredits.Contribution.functions.totalKreditsEarned(false);
let totalKreditsEarnedConfirmed = await kredits.Contribution.contract.totalKreditsEarned(true); let totalKreditsEarnedConfirmed = await kredits.Contribution.functions.totalKreditsEarned(true);
console.log(`Total Kredits: ${totalKreditsEarnedConfirmed} (confirmed) | ${totalKreditsEarnedUnConfirmed} (including unconfirmed)`); console.log(`Total Kredits: ${totalKreditsEarnedConfirmed} (confirmed) | ${totalKreditsEarnedUnConfirmed} (including unconfirmed)`);
} catch (err) { } catch (err) {
console.log(err); console.log(err);

View File

@@ -3,15 +3,13 @@ const path = require('path');
const ethers = require('ethers'); const ethers = require('ethers');
const fileInject = require('./helpers/file_inject.js'); const fileInject = require('./helpers/file_inject.js');
const getNetworkId = require('./helpers/networkid.js');
const KreditsKit = require('../lib/kreditskit'); const KreditsKit = require('../lib/kreditskit');
const addressesPath = path.join(__dirname, '..', 'lib/addresses'); const addressesPath = path.join(__dirname, '..', 'lib/addresses');
module.exports = async function(callback) { module.exports = async function(callback) {
const provider = new ethers.providers.Web3Provider(web3.currentProvider); const networkId = await getNetworkId(web3)
const signer = provider.getSigner();
const network = await provider.getNetwork();
const networkId = network.chainId;
console.log(`Deploying to networkId: ${networkId}`) console.log(`Deploying to networkId: ${networkId}`)
let kitAddresseFile = path.join(addressesPath, 'KreditsKit.json'); let kitAddresseFile = path.join(addressesPath, 'KreditsKit.json');
@@ -22,6 +20,9 @@ module.exports = async function(callback) {
} }
console.log(`Using KreditsKit at: ${kreditsKitAddress}`); console.log(`Using KreditsKit at: ${kreditsKitAddress}`);
const provider = new ethers.providers.Web3Provider(web3.currentProvider);
let signer = provider.getSigner();
let kit = await new KreditsKit(provider, signer).init() let kit = await new KreditsKit(provider, signer).init()
// TODO: get rid of the hard coded gas limit // TODO: get rid of the hard coded gas limit

View File

@@ -38,7 +38,7 @@ module.exports = async function(callback) {
if (contractWrapper[method]) { if (contractWrapper[method]) {
func = contractWrapper[method]; func = contractWrapper[method];
} else { } else {
func = contractWrapper.contract[method]; func = contractWrapper.functions[method];
} }
func.apply(contractWrapper, args).then((result) => { func.apply(contractWrapper, args).then((result) => {
console.log(`[OK] kredits.${contractName}.${method}(${JSON.stringify(args)}) => ${result.hash}`); console.log(`[OK] kredits.${contractName}.${method}(${JSON.stringify(args)}) => ${result.hash}`);

View File

@@ -5,8 +5,7 @@ module.exports = async function(callback) {
let amount = await promptly.prompt('Amount: ', {default: '1'}); let amount = await promptly.prompt('Amount: ', {default: '1'});
amount = parseInt(amount); amount = parseInt(amount);
const accounts = await web3.eth.personal.getAccounts(); let fromAccount = web3.eth.accounts[0];
let fromAccount = accounts[0];
let fromBalance = await web3.eth.getBalance(fromAccount); let fromBalance = await web3.eth.getBalance(fromAccount);
let recipientBalance = await web3.eth.getBalance(recipient); let recipientBalance = await web3.eth.getBalance(recipient);
@@ -14,11 +13,11 @@ module.exports = async function(callback) {
console.log(`sender account balance ${fromAccount}: ${fromBalance}`); console.log(`sender account balance ${fromAccount}: ${fromBalance}`);
console.log(`recipient account balance ${recipient}: ${recipientBalance}`); console.log(`recipient account balance ${recipient}: ${recipientBalance}`);
console.log(`\nsending ${amount} ETH from ${accounts[0]} to ${recipient}`); console.log(`\nsending ${amount} ETH from ${web3.eth.accounts[0]} to ${recipient}`);
let transaction = await web3.eth.sendTransaction({to: recipient, value: web3.utils.toWei(new web3.utils.BN(amount)), from: accounts[0]}); let transaction = await web3.eth.sendTransaction({to: recipient, value: web3.toWei(amount), from: web3.eth.accounts[0]});
console.log(`transaction id: ${transaction.transactionHash}`); console.log(`transaction id: ${transaction}`);
recipientBalance = await web3.eth.getBalance(recipient); recipientBalance = await web3.eth.getBalance(recipient);
console.log(`\nnew recipient account balance ${recipient}: ${recipientBalance}`); console.log(`\nnew recipient account balance ${recipient}: ${recipientBalance}`);

View File

@@ -15,7 +15,7 @@ module.exports = async function(callback) {
console.log(`Recording a veto for contribution #${contributionId}`); console.log(`Recording a veto for contribution #${contributionId}`);
try { try {
kredits.Contribution.contract.veto(contributionId, { gasLimit: 300000 }) kredits.Contribution.functions.veto(contributionId, { gasLimit: 300000 })
.then(result => { .then(result => {
console.log("\n\nResult:"); console.log("\n\nResult:");
console.log(result); console.log(result);

8836
yarn.lock Normal file

File diff suppressed because it is too large Load Diff