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
This commit is contained in:
Teemu Patja 2017-08-22 20:27:01 +03:00
parent e995769e90
commit 9cfd27a0b6
No known key found for this signature in database
GPG Key ID: F5B7035E6580FD4C
3 changed files with 62 additions and 28 deletions

View File

@ -339,6 +339,13 @@ updated = timezone('utc'::text, now())
WHERE contract_address = :contract_address; 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 :? :* -- :name open-bounties :? :*
-- :doc all bounty issues for given owner -- :doc all bounty issues for given owner
SELECT SELECT

View File

@ -17,7 +17,7 @@
[issue-id commit-sha] [issue-id commit-sha]
(jdbc/with-db-connection [con-db *db*] (jdbc/with-db-connection [con-db *db*]
(db/update-commit-sha con-db {:issue_id issue-id (db/update-commit-sha con-db {:issue_id issue-id
:commit_sha commit-sha}))) :commit_sha commit-sha})))
(defn get-issue-titles (defn get-issue-titles
[] []
@ -26,7 +26,7 @@
(defn update-issue-title (defn update-issue-title
[issue-id 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 (db/update-issue-title con-db {:issue_id issue-id
:title title}))) :title title})))
@ -68,10 +68,16 @@
[contract-address balance] [contract-address balance]
(jdbc/with-db-connection [con-db *db*] (jdbc/with-db-connection [con-db *db*]
(db/update-eth-balance con-db {:contract_address contract-address (db/update-eth-balance con-db {:contract_address contract-address
:balance balance}))) :balance balance})))
(defn update-token-balances (defn update-token-balances
[contract-address 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 (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})))

View File

@ -155,7 +155,6 @@
[bounty-addr] [bounty-addr]
(doseq [[tla token-data] (token-data/as-map)] (doseq [[tla token-data] (token-data/as-map)]
(let [balance (multisig/token-balance bounty-addr tla)] (let [balance (multisig/token-balance bounty-addr tla)]
(println tla bounty-addr balance)
(when (> balance 0) (when (> balance 0)
(do (do
(log/debug "bounty at" bounty-addr "has" balance "of token" tla) (log/debug "bounty at" bounty-addr "has" balance "of token" tla)
@ -169,9 +168,30 @@
[] []
(doseq [{bounty-address :contract_address} (doseq [{bounty-address :contract_address}
(db-bounties/open-bounty-contracts)] (db-bounties/open-bounty-contracts)]
(println "bounty-address" bounty-address)
(update-bounty-token-balances 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 (defn update-balances
[] []
(doseq [{contract-address :contract_address (doseq [{contract-address :contract_address
@ -211,23 +231,10 @@
balance-eth balance-eth
balance-eth-str)))))) 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-1-min-interval-tasks [time]
(defn run-periodic-tasks [time]
(do (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 ;; TODO: disabled for now. looks like it may cause extraneus
;; contract deployments and costs ;; contract deployments and costs
#_(redeploy-failed-contracts) #_(redeploy-failed-contracts)
@ -238,21 +245,35 @@
(self-sign-bounty) (self-sign-bounty)
(update-contract-internal-balances) (update-contract-internal-balances)
(update-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 (mount/defstate scheduler
:start (let [every-minute (rest :start (let [every-minute (rest
(periodic-seq (t/now) (periodic-seq (t/now)
(t/minutes 1))) (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 stop-fn (chime-at every-minute
run-periodic-tasks run-1-min-interval-tasks
{:error-handler (fn [e] {:error-handler error-handler})
(log/error "Scheduled task failed" e) stop-fn2 (chime-at every-10-minutes
(throw e))})] run-10-min-interval-tasks
{:error-handler error-handler})]
(log/info "started scheduler") (log/info "started scheduler")
(bounties/update-bounty-issue-titles) (bounties/update-bounty-issue-titles)
stop-fn) (fn [] (do (stop-fn) (stop-fn2))))
:stop (do :stop (do
(log/info "stopping scheduler") (log/info "stopping scheduler")
(scheduler))) (scheduler)))