From 64f5d3bb5a9e64c79a074768ab0cf63011f7a36a Mon Sep 17 00:00:00 2001 From: Martin Klepsch Date: Tue, 13 Feb 2018 14:47:01 +0100 Subject: [PATCH 1/9] improve postgres setup instructions in readme --- README.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 98216f5..dbb34ec 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,8 @@ You will need [Leiningen](https://github.com/technomancy/leiningen) 2.0 or above Make sure you install [PostgreSQL](https://www.postgresql.org/) and properly set it up: ``` -sudo -u postgres psql -c "CREATE USER commiteth WITH PASSWORD 'commiteth';" -sudo -u postgres createdb commiteth +psql postgres -c "CREATE USER commiteth WITH PASSWORD 'commiteth';" +psql postgres -c "CREATE DATABASE commiteth;" ``` ## Running @@ -37,14 +37,6 @@ lein figwheel lein less auto ``` - -Make sure you install [PostgreSQL](https://www.postgresql.org/) and properly set it up: - -``` -sudo -u postgres psql -c "CREATE USER commiteth WITH PASSWORD 'commiteth';" -sudo -u postgres createdb commiteth -``` - ### solc Solidity compiler [0.4.15](https://github.com/ethereum/solidity/releases/tag/v0.4.15) is required and needs to be in $PATH. From 957de197b7754a761ff5bbfbd7d1b699d45f7b83 Mon Sep 17 00:00:00 2001 From: pablodip Date: Tue, 13 Feb 2018 16:26:17 +0100 Subject: [PATCH 2/9] currency-filter-or --- src/cljs/commiteth/ui_model.cljs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index fd7d41c..b5824bb 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -87,10 +87,11 @@ ::bounty-filter-type.category ::bounty-filter-type-category|multiple-dynamic-options ::bounty-filter-type.re-frame-subs-key-for-options :commiteth.subscriptions/open-bounties-currencies ::bounty-filter-type.predicate (fn [filter-value bounty] - (and (or (not-any? #{"ETH"} filter-value) - (< 0 (:balance-eth bounty))) - (set/subset? (->> filter-value (remove #{"ETH"}) set) - (-> bounty :tokens keys set))))} + (or (and (some #{"ETH"} filter-value) + (< 0 (:balance-eth bounty))) + (not-empty (set/intersection + (->> filter-value (remove #{"ETH"}) set) + (-> bounty :tokens keys set)))))} ::bounty-filter-type|date {::bounty-filter-type.name "Date" From 7587b21154b54846fc7debb993e7cb4f8809cb10 Mon Sep 17 00:00:00 2001 From: pablodip Date: Tue, 13 Feb 2018 16:27:56 +0100 Subject: [PATCH 3/9] fix cs --- src/cljs/commiteth/ui_model.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index b5824bb..d200bbe 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -88,7 +88,7 @@ ::bounty-filter-type.re-frame-subs-key-for-options :commiteth.subscriptions/open-bounties-currencies ::bounty-filter-type.predicate (fn [filter-value bounty] (or (and (some #{"ETH"} filter-value) - (< 0 (:balance-eth bounty))) + (< 0 (:balance-eth bounty))) (not-empty (set/intersection (->> filter-value (remove #{"ETH"}) set) (-> bounty :tokens keys set)))))} From 9297de5660f074de0eff8728c52ad980b5142dd9 Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 14 Feb 2018 08:05:01 +0100 Subject: [PATCH 4/9] some details --- src/cljs/commiteth/ui_model.cljs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index d200bbe..909828c 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -87,11 +87,12 @@ ::bounty-filter-type.category ::bounty-filter-type-category|multiple-dynamic-options ::bounty-filter-type.re-frame-subs-key-for-options :commiteth.subscriptions/open-bounties-currencies ::bounty-filter-type.predicate (fn [filter-value bounty] - (or (and (some #{"ETH"} filter-value) + (or (and (contains? #{"ETH"} filter-value) (< 0 (:balance-eth bounty))) - (not-empty (set/intersection - (->> filter-value (remove #{"ETH"}) set) - (-> bounty :tokens keys set)))))} + (not-empty + (set/intersection + (->> filter-value (remove #{"ETH"}) set) + (-> bounty :tokens keys set)))))} ::bounty-filter-type|date {::bounty-filter-type.name "Date" From 26ac02caf5e00c44c6ee2edc2138f1bd6b2f9ec9 Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 14 Feb 2018 08:19:25 +0100 Subject: [PATCH 5/9] fix vertical height in filter boxes --- src/less/style.less | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/less/style.less b/src/less/style.less index e9f80a2..8b90d73 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -448,6 +448,8 @@ position: relative; display: flex; z-index: 1000; + height: 100%; + align-items: center; .text { margin: 8px 12px; From 3d3caa9b1a846dd29ac9788a96621b6e603275fc Mon Sep 17 00:00:00 2001 From: Martin Klepsch Date: Tue, 13 Feb 2018 15:24:02 +0100 Subject: [PATCH 6/9] provide links to installation instructinos for solc and web3j --- README.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index dbb34ec..4d3138e 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,17 @@ psql postgres -c "CREATE USER commiteth WITH PASSWORD 'commiteth';" psql postgres -c "CREATE DATABASE commiteth;" ``` +### solc + +Solidity compiler [0.4.15](https://github.com/ethereum/solidity/releases/tag/v0.4.15) is required and needs to be in $PATH. +Detailed [installation instructions for various platforms](https://solidity.readthedocs.io/en/develop/installing-solidity.html) can be found in the official Solidity documentation. + +### web3j + +Web3j [2.3.0](https://github.com/web3j/web3j/releases/tag/v2.3.0) is required and the command line tools need to be in $PATH. +Installation instructions for the command line tools can be found in the [Web3j Command Line Tools documentation](https://docs.web3j.io/command_line.html). + + ## Running Launch following commands each in its own shell: @@ -37,14 +48,6 @@ lein figwheel lein less auto ``` -### solc - -Solidity compiler [0.4.15](https://github.com/ethereum/solidity/releases/tag/v0.4.15) is required and needs to be in $PATH. - -### web3j - -Web3j [2.3.0](https://github.com/web3j/web3j/releases/tag/v2.3.0) is required and the command line tools need to be in $PATH. - ## Application config Make sure to create `/config-dev.edn` and populate it correctly, which is based on `env/dev/resources/config.edn`. Description of config fields is given below: From dffb6104a25fa3f9e3dd349ca79d287ae2cc5bbc Mon Sep 17 00:00:00 2001 From: Martin Klepsch Date: Tue, 13 Feb 2018 17:12:20 +0100 Subject: [PATCH 7/9] provide homebrew instructions for solc and web3j --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 4d3138e..13295f1 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,20 @@ psql postgres -c "CREATE DATABASE commiteth;" Solidity compiler [0.4.15](https://github.com/ethereum/solidity/releases/tag/v0.4.15) is required and needs to be in $PATH. Detailed [installation instructions for various platforms](https://solidity.readthedocs.io/en/develop/installing-solidity.html) can be found in the official Solidity documentation. +``` +brew install https://raw.githubusercontent.com/ethereum/homebrew-ethereum/de1da16f7972a899fc8dd1f3f04299eced6f4312/solidity.rb +brew pin solidity +``` + ### web3j Web3j [2.3.0](https://github.com/web3j/web3j/releases/tag/v2.3.0) is required and the command line tools need to be in $PATH. Installation instructions for the command line tools can be found in the [Web3j Command Line Tools documentation](https://docs.web3j.io/command_line.html). +``` +brew install https://raw.githubusercontent.com/web3j/homebrew-web3j/881cf369b551a5f2557bd8fb02fa8b7b970256ca/web3j.rb +brew pin web3j +``` ## Running From 6f366e3dc6bc9e8dbe04d12fc3d3b02df1ce90fe Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Wed, 14 Feb 2018 16:09:53 +0200 Subject: [PATCH 8/9] Add wiki docs to the repo --- CONTRIBUTING.md | 28 +++++++++++++++++++++ doc/deployment_flow.md | 16 ++++++++++++ doc/payout_flow.md | 57 ++++++++++++++++++++++++++++++++++++++++++ doc/sync_issues.md | 11 ++++++++ 4 files changed, 112 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 doc/deployment_flow.md create mode 100644 doc/payout_flow.md create mode 100644 doc/sync_issues.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..017daf0 --- /dev/null +++ b/CONTRIBUTING.md @@ -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. diff --git a/doc/deployment_flow.md b/doc/deployment_flow.md new file mode 100644 index 0000000..8a46f7f --- /dev/null +++ b/doc/deployment_flow.md @@ -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 diff --git a/doc/payout_flow.md b/doc/payout_flow.md new file mode 100644 index 0000000..315eee9 --- /dev/null +++ b/doc/payout_flow.md @@ -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:..." diff --git a/doc/sync_issues.md b/doc/sync_issues.md new file mode 100644 index 0000000..9c3ff6e --- /dev/null +++ b/doc/sync_issues.md @@ -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. + From 0a50beb977b8a00250a2e8bbbaa448eb168f1815 Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Wed, 14 Feb 2018 18:23:29 +0200 Subject: [PATCH 9/9] Add README with table of contents in doc dir --- doc/README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 doc/README.md diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..65c2d8d --- /dev/null +++ b/doc/README.md @@ -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)