This repository has been archived by the owner on Apr 26, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 36
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'develop' into feature/readd-bounty-#185
- Loading branch information
Showing
57 changed files
with
1,488 additions
and
197 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
docker-compose.yml | ||
Dockerfile | ||
Jenkinsfile |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
This document describes process guidelines to be followed when contributing to Status Open Bounty repo. | ||
|
||
First, make sure to familiarize yourself with the [README](https://github.com/status-im/open-bounty/blob/develop/README.md) and [Testing](https://github.com/status-im/open-bounty/blob/develop/doc/testing.md) documents in order to setup the project properly. | ||
|
||
# Issues | ||
- Issues should have type, priority and size (difficulty) assigned via corresponding labels | ||
- Issue descriptions should include the following fields: | ||
- **Summary** | ||
- **Type** | ||
- (*Features or enhancements only*) **User story** | ||
- (*Bugs only*) **Expected behavior** | ||
- (*Bugs only*) **Actual behavior** | ||
- **Additional information** | ||
|
||
# Pull requests | ||
- Branch names should include: | ||
- prefixes indicating issue type (`bug`, `feature`, `doc`, `test`) | ||
- short description in lisp-case | ||
- and include associated issue number | ||
|
||
For instance, `bug/messy-problem-#1234` | ||
- Start the title of the PR with [FIX #NNN], where #NNN is the issue number | ||
- Always include `Status:` in the PR description to indicate whether PR is `WIP` or `Finished`. | ||
- PR description should include the following sections: | ||
- **Summary** | ||
- **Notes** | ||
- **Status** | ||
- Merges into `develop` branch should be approved by at least 1 person, into `master` - by 2. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
FROM clojure as builder | ||
|
||
WORKDIR /tmp | ||
|
||
RUN wget -O /usr/local/bin/solc https://github.com/ethereum/solidity/releases/download/v0.4.15/solc-static-linux | ||
RUN chmod +x /usr/local/bin/solc | ||
|
||
RUN wget https://github.com/web3j/web3j/releases/download/v2.3.0/web3j-2.3.0.tar | ||
RUN tar -xf web3j-2.3.0.tar | ||
RUN cp -r web3j-2.3.0/* /usr/local/ | ||
|
||
|
||
COPY . /usr/src/app | ||
WORKDIR /usr/src/app | ||
|
||
ENV LEIN_SNAPSHOTS_IN_RELEASE=1 | ||
|
||
|
||
RUN lein less once | ||
RUN lein uberjar | ||
|
||
|
||
FROM clojure | ||
WORKDIR /root/ | ||
|
||
COPY --from=builder /usr/src/app/target/uberjar/commiteth.jar . | ||
|
||
CMD [""] | ||
ENTRYPOINT ["/usr/bin/java", "-Duser.timezone=UTC", "-Dconf=config-test.edn", "-jar", "/root/commiteth.jar"] | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
#!/usr/bin/env groovy | ||
|
||
node('linux') { | ||
checkout scm | ||
|
||
def dockerreponame = "statusim/openbounty-app" | ||
|
||
try { | ||
stage('Build & push') { | ||
|
||
GIT_COMMIT_HASH = sh (script: "git rev-parse --short HEAD | tr -d '\n'", returnStdout: true) | ||
|
||
docker.withRegistry('https://index.docker.io/v1/', 'dockerhub-statusvan') { | ||
def openbountyApp = docker.build("${dockerreponame}:${env.BUILD_NUMBER}") | ||
openbountyApp.push("${env.BRANCH_NAME}") | ||
if (env.BRANCH_NAME == 'develop') { | ||
openbountyApp.push("develop") | ||
} else if (env.BRANCH_NAME == 'master') { | ||
openbountyApp.push("master") | ||
} else { | ||
println "Not named branch have no custom tag" | ||
} | ||
} | ||
|
||
} | ||
|
||
stage('Deploy') { | ||
build job: 'status-openbounty/openbounty-cluster', parameters: [[$class: 'StringParameterValue', name: 'DEPLOY_ENVIRONMENT', value: "dev"], [$class: 'StringParameterValue', name: 'BRANCH', value: env.BRANCH_NAME]] | ||
} | ||
|
||
} catch (e) { | ||
// slackSend color: 'bad', message: REPO + ":" + BRANCH_NAME + ' failed to build. ' + env.BUILD_URL | ||
throw e | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
# Table of contents | ||
|
||
- [Testing guide](doc/testing.md) | ||
- [Troubleshooting](doc/cookbook.md) | ||
- [Deployment flow](doc/deployment_flow.md) | ||
- [Payout flow](doc/payout_flow.md) | ||
- [Common sync issues](doc/sync_issues.md) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# Cookbook | ||
|
||
Here some common tasks/issues are listed along with their solutions. | ||
|
||
## Change config and restart the service | ||
- ssh to the host running commiteth | ||
- go to `/opt/commiteth` for prod or `/opt/commiteth-test` for test environment. | ||
- there edit `config.edn` | ||
- restart the service with `sudo service commiteth-test restart` | ||
|
||
## Manually add a GitHub repo to SOB app | ||
Sometimes SOB will not | ||
- connect to Postgres instance. Get DB name and username/password from respective `config.edn` (see previous answer). These are set in `:jdbc-database-url` field. | ||
- execute the query, e.g. | ||
``` | ||
insert into repositories(repo_id,user_id,owner,repo,hook_id,state,hook_secret,owner_avatar_url) values(116971984,447328, 'aragon', 'aragon-monthly', 0, 2, '', 'https://avatars1.githubusercontent.com/u/24612534?v=4'); | ||
``` | ||
Note that the value for repo_id field is GitHub's internal repo ID. One way of obtaining it is navigating to `api.github.com/repos/:owner/:repo_name`, e.g. `https://api.github.com/repos/aragon/aragon-monthly`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# Deployment flow | ||
|
||
This briefly describes events that occur when an issue is labeled as bounty and a new contract has to be deployed. | ||
|
||
1. Issue is labeled | ||
2. Event is received via GitHub App webhook | ||
3. Contract is deployed | ||
4. GitHub issue comment "Deploying contract..." is posted | ||
5. `transaction_hash` is stored in the `issues` table | ||
|
||
The following items execute in scheduler threads that run each minute, so up to 60 sec delay can be expected. | ||
|
||
6. `update-issue-contract-address` scheduler thread fetches transaction receipt, updates `contract_address` and updates GitHub comment with a new image and current balance | ||
7. `deploy-pending-contracts` scheduler thread checks if there are issues that did not have corresponding contracts deployed and attempts to redeploy | ||
8. `update-balances` scheduler thread checks balances and updates GitHub comment accordingly | ||
9. `update-contract-internal-balances` scheduler threads updates internal ERC20 token balances for all deployed contracts. This is required by current contract code |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
# Payout flow | ||
|
||
This describes the sequence of events happening once a PR for an issue with a bounty was merged by repo maintainer. | ||
|
||
### Quick info on transaction hashes | ||
In the sequence described below, several types of hashes are used. SOB checks presence of different hashes on records in the `issues` table to decide which action to take on an issue and associated contract. These hashes are: | ||
- `transaction_hash`: set when contract is deployed to the labeled issue | ||
- `execute_hash`: set when PR for an issue with a bounty was merged | ||
- `confirm_hash`: fetched from receipt from transaction invoked in previous step | ||
- `payout_hash`: set when payout was confirmed via `Manage Payouts` | ||
|
||
The event flow is given below. For the bounty to be paid, each issue has to go through the steps in given order. | ||
|
||
### 1. PR closed and merged | ||
- app receives notification via GitHub App webhook (endpoint: `/webhook-app`) | ||
- `handle-claim` fn is invoked which will: | ||
- save PR in the `pull_requests` DB table, where state=1 for merged PRs | ||
- update issue in the DB with commit SHA, if PR was merged | ||
|
||
Afterwards two interleaving sequences of actions come into play: scheduler threads and manual user interaction in the `Manage Payouts` tab. | ||
|
||
### 2. `self-sign-bounty` scheduler thread | ||
- input query name: `pending-bounties`. This selects pending bounties (where `execute_hash` is nil and `commit_sha` is set) | ||
- execute payout transactions | ||
- store `execute_hash` and `winner_login` in `issues` DB table | ||
- update GitHub comment to "Pending maintainer confirmation" | ||
### 3. `update-confirm-hash` scheduler thread | ||
- input query name: `pending-payouts`. This selects bounties with `execute_hash` set and no `confirm_hash` | ||
- fetch `confirm_hash` from transaction receipt | ||
- store `confirm_hash` in `issues` DB table | ||
|
||
### 4. Manage Payouts view | ||
In order to confirm a payout, following conditions have to be met for an issue: | ||
- it is merged | ||
- not paid yet (meaning its `payout_hash` is nil) | ||
- not being confirmed at the moment (`:confirming?` flag is true) | ||
OR | ||
- already confirmed by a scheduler thread(`confirm_hash` is not nil) | ||
|
||
Note that `confirm_hash` issue field and confirmation action in the UI are different things, albeit identically named. In order to confirm a payout from the UI, `confirm_hash` has to be already set by scheduler thread (see above). | ||
|
||
Payout confirmation action results in a `:confirm-payout` event. Its handler will | ||
- use `confirm_hash` to construct transaction payload | ||
- set `:confirming?` flag to `true` | ||
- execute `confirmTransaction()` call | ||
- pass transaction callback to `confirmTransaction()`. Once invoked, the callback will: | ||
- get `payout_hash` passed as an argument | ||
- dispatch `:save-payout-hash` event. Its handler will: | ||
- POST to /api/user/bounty/%s/payout | ||
- This will update `payout_hash` in `issues` DB table | ||
- if POST is successful, dispatch `:payout-confirmed` | ||
- `:payout-confirmed` will update `:confirmed?` to `true` and remove `:confirming?` flag | ||
|
||
### 5. `update-payout-receipt` scheduler thread | ||
- input query name: `confirmed-payouts`. This selects confirmed payouts (the ones that have `payout_hash` and do not have `payout_receipt` set) | ||
- store `payout_receipt` in `issues` DB table | ||
- and update GitHub comment to "Paid to:..." |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# Common sync issues | ||
|
||
- Repo rename. Related issue: https://github.com/status-im/open-bounty/issues/219. | ||
- Transaction callback not executed, hence payout-hash not set. | ||
- App downtime, multiple GitHub App deliveries failing. These can be afterwards replayed from GitHub App's Advanced tab. | ||
- Geth issue. Not solvable on app end, Geth restart usually fixes these. | ||
- Bot out of gas. Relevant issue: https://github.com/status-im/open-bounty/issues/195. | ||
- Sometimes repos are disabled in DB (state=0), probably only happens to repos that were added earlier through OAuth App. | ||
- PRs might end up in state=0 (opened) instead of state=1(merged), if PR did not have a proper text ("Fixes #..."). This one needs more investigation and more cases to reproduce. | ||
- Sometimes contract_address cannot be fetched for a long period of time. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.