From 9cfd27a0b67bf3d444af018a3dd9587daa56a8c0 Mon Sep 17 00:00:00 2001 From: Teemu Patja Date: Tue, 22 Aug 2017 20:27:01 +0300 Subject: [PATCH] Periodicically update bounty total USD values to DB * peridic updating of total USD value for open bounties * support 1 and 10 minute interval tasks in scheduler --- resources/sql/queries.sql | 7 ++++ src/clj/commiteth/db/issues.clj | 16 +++++--- src/clj/commiteth/scheduler.clj | 67 ++++++++++++++++++++++----------- 3 files changed, 62 insertions(+), 28 deletions(-) diff --git a/resources/sql/queries.sql b/resources/sql/queries.sql index 5fe7c74..4fdbfbf 100644 --- a/resources/sql/queries.sql +++ b/resources/sql/queries.sql @@ -339,6 +339,13 @@ updated = timezone('utc'::text, now()) WHERE contract_address = :contract_address; +-- :name update-usd-value :! :n +-- :doc updates issue with given USD value +UPDATE issues +SET value_usd = :usd_value +WHERE contract_address = :contract_address; + + -- :name open-bounties :? :* -- :doc all bounty issues for given owner SELECT diff --git a/src/clj/commiteth/db/issues.clj b/src/clj/commiteth/db/issues.clj index 5e49ea3..912c5c7 100644 --- a/src/clj/commiteth/db/issues.clj +++ b/src/clj/commiteth/db/issues.clj @@ -17,7 +17,7 @@ [issue-id commit-sha] (jdbc/with-db-connection [con-db *db*] (db/update-commit-sha con-db {:issue_id issue-id - :commit_sha commit-sha}))) + :commit_sha commit-sha}))) (defn get-issue-titles [] @@ -26,7 +26,7 @@ (defn update-issue-title [issue-id title] - (jdbc/with-db-connection [con-db *db*] + (jdbc/with-db-connection [con-db *db*] (db/update-issue-title con-db {:issue_id issue-id :title title}))) @@ -68,10 +68,16 @@ [contract-address balance] (jdbc/with-db-connection [con-db *db*] (db/update-eth-balance con-db {:contract_address contract-address - :balance balance}))) + :balance balance}))) (defn update-token-balances [contract-address balances] - (jdbc/with-db-connection [con-db *db*] + (jdbc/with-db-connection [con-db *db*] (db/update-token-balances con-db {:contract_address contract-address - :token_balances balances}))) + :token_balances balances}))) + +(defn update-usd-value + [contract-address usd-value] + (jdbc/with-db-connection [con-db *db*] + (db/update-usd-value con-db {:contract_address contract-address + :usd_value usd-value}))) diff --git a/src/clj/commiteth/scheduler.clj b/src/clj/commiteth/scheduler.clj index 6eff798..628e02c 100644 --- a/src/clj/commiteth/scheduler.clj +++ b/src/clj/commiteth/scheduler.clj @@ -155,7 +155,6 @@ [bounty-addr] (doseq [[tla token-data] (token-data/as-map)] (let [balance (multisig/token-balance bounty-addr tla)] - (println tla bounty-addr balance) (when (> balance 0) (do (log/debug "bounty at" bounty-addr "has" balance "of token" tla) @@ -169,9 +168,30 @@ [] (doseq [{bounty-address :contract_address} (db-bounties/open-bounty-contracts)] - (println "bounty-address" bounty-address) (update-bounty-token-balances bounty-address))) + +(defn get-bounty-funds + "Get funds in given bounty contract. + Returns map of asset -> balance + + key total-usd -> current total USD value for all funds" + [bounty-addr] + (let [token-balances (multisig/token-balances bounty-addr) + eth-balance (read-string (eth/get-balance-eth bounty-addr 4)) + all-funds + (merge token-balances + {:ETH eth-balance})] + (merge all-funds {:total-usd (fiat-util/bounty-usd-value all-funds)}))) + +(defn update-open-issue-usd-values + "Sum up current USD values of all crypto assets in a bounty and store to DB" + [] + (doseq [{bounty-addr :contract_address} + (db-bounties/open-bounty-contracts)] + (let [funds (get-bounty-funds bounty-addr)] + (issues/update-usd-value bounty-addr + (:total-usd funds))))) + (defn update-balances [] (doseq [{contract-address :contract_address @@ -211,23 +231,10 @@ balance-eth balance-eth-str)))))) -(defn get-bounty-funds - "Get funds in given bounty contract. - Returns map of asset -> balance - + key total-usd -> current total USD value for all funds" - [bounty-addr] - (let [token-balances (multisig/token-balances bounty-addr) - eth-balance (read-string (eth/get-balance-eth bounty-addr 4)) - all-funds - (merge token-balances - {:ETH eth-balance})] - (merge all-funds {:total-usd (fiat-util/bounty-usd-value all-funds)}))) - - -(defn run-periodic-tasks [time] +(defn run-1-min-interval-tasks [time] (do - (log/debug "run-periodic-tasks" time) + (log/debug "run-1-min-interval-tasks" time) ;; TODO: disabled for now. looks like it may cause extraneus ;; contract deployments and costs #_(redeploy-failed-contracts) @@ -238,21 +245,35 @@ (self-sign-bounty) (update-contract-internal-balances) (update-balances) - (log/debug "run-periodic-tasks done"))) + (log/debug "run-1-min-interval-tasks done"))) + + +(defn run-10-min-interval-tasks [time] + (do + (log/debug "run-1-min-interval-tasks" time) + (update-open-issue-usd-values) + (log/debug "run-10-min-interval-tasks done"))) (mount/defstate scheduler :start (let [every-minute (rest (periodic-seq (t/now) (t/minutes 1))) + every-10-minutes (rest + (periodic-seq (t/now) + (t/minutes 10))) + error-handler (fn [e] + (log/error "Scheduled task failed" e) + (throw e)) stop-fn (chime-at every-minute - run-periodic-tasks - {:error-handler (fn [e] - (log/error "Scheduled task failed" e) - (throw e))})] + run-1-min-interval-tasks + {:error-handler error-handler}) + stop-fn2 (chime-at every-10-minutes + run-10-min-interval-tasks + {:error-handler error-handler})] (log/info "started scheduler") (bounties/update-bounty-issue-titles) - stop-fn) + (fn [] (do (stop-fn) (stop-fn2)))) :stop (do (log/info "stopping scheduler") (scheduler)))