move update-confirm-hash back to scheduler, make sure job is in 1-min tasks

This commit is contained in:
Rob Culliton 2018-05-01 21:53:02 -04:00
parent d9bb04036d
commit cec0718b1e
No known key found for this signature in database
GPG Key ID: 6FDEF60B3DC84D94
2 changed files with 63 additions and 50 deletions

View File

@ -171,18 +171,6 @@
{:execute-hash execute-hash
:execute-write execute-write}))
(defn update-confirm-hash
[issue-id execute-hash]
(log/infof "issue %s: pending payout: %s" issue-id execute-hash)
(try
(when-let [receipt (eth/get-transaction-receipt execute-hash)]
(log/infof "issue %s: execution receipt for issue " issue-id receipt)
(when-let [confirm-hash (multisig/find-confirmation-tx-id receipt)]
(log/infof "issue %s: confirm hash:" issue-id confirm-hash)
(db-bounties/update-confirm-hash issue-id confirm-hash)
{:confirm_hash confirm-hash}))
(catch Throwable ex
(log/errorf ex "issue %s: update-confirm-hash exception:" issue-id))))
(defapi service-routes
(when (:dev env)
@ -278,7 +266,7 @@
(do (log/infof "calling revoke-initiate for %s with %s %s" issue-id contract-address owner-address)
(if-let [{:keys [execute-hash execute-write]} (execute-revocation issue-id contract-address owner-address)]
(if (scheduler/poll-transaction-logs execute-hash contract-address)
(if-let [{confirm-hash :confirm_hash} (update-confirm-hash issue-id execute-hash)]
(if-let [{confirm-hash :confirm_hash} (scheduler/update-confirm-hash issue-id execute-hash)]
(ok {:confirm-hash confirm-hash})
(bad-request "The confirm hash could not be updated"))
(bad-request "The transaction hash could not be confirmed in a reasonable amount of time"))

View File

@ -149,6 +149,30 @@
(log/error ex "issue %s: self-sign-bounty exception" issue-id)))))
(log/info "Exit self-sign-bounty"))
(defn update-confirm-hash
[issue-id execute-hash]
(log/infof "issue %s: pending payout: %s" issue-id execute-hash)
(try
(when-let [receipt (eth/get-transaction-receipt execute-hash)]
(log/infof "issue %s: execution receipt for issue " issue-id receipt)
(when-let [confirm-hash (multisig/find-confirmation-tx-id receipt)]
(log/infof "issue %s: confirm hash:" issue-id confirm-hash)
(db-bounties/update-confirm-hash issue-id confirm-hash)
{:confirm_hash confirm-hash}))
(catch Throwable ex
(log/errorf ex "issue %s: update-confirm-hash exception:" issue-id))))
(defn update-confirm-hashes
"Gets transaction receipt for each pending payout and updates DB confirm_hash with tranaction ID of commiteth bot account's confirmation."
[]
(log/info "In update-confirm-hashes")
(p :update-confirm-hash
(doseq [{issue-id :issue_id
execute-hash :execute_hash} (db-bounties/pending-payouts)]
(update-confirm-hash issue-id execute-hash)))
(log/info "Exit update-confirm-hash"))
(defn update-watch-hash
"Sets watch-hash to NULL for bounties where watch tx has been mined. Used to avoid unneeded watch transactions in update-bounty-token-balances"
[]
@ -252,6 +276,43 @@
(neg? n) (- n)
:else n))
(defn contract-confirmation-logs [contract-address]
"retrives all log events for the confirmation topic since contract creation"
(some-> contract-address
issues/get-issue-by-contract-address
:transaction_hash
eth/get-transaction-by-hash
:blockNumber
(eth/get-logs contract-address [(:confirmation multisig/topics)])))
(defn hash-in-logs?
"return true if the transaction hash is present in the queryable blockchain"
[hash logs]
(some #(= hash (:transactionHash %)) logs))
(defn execution-status [execute-hash contract-address]
"check to see if a given execute-hash has been confirmed"
(log/infof "checking contract for logs containing %s" execute-hash)
(let [logs (contract-confirmation-logs contract-address)]
(hash-in-logs? execute-hash logs)))
(defn poll-transaction-logs [execute-hash contract-address]
"check for execution hash in logs for a few minutes"
(let [found? (promise)
intervals (take 6
(periodic-seq (t/now)
(t/seconds 30)))]
;; polling will be slow but if we want to move to an event driven
;; model then we can listen for events, rather than logs, once we're
;; using a geth node again
(chime-at intervals
(fn [time]
(when (execution-status execute-hash contract-address)
(deliver found? true)))
{:on-finished (fn []
(deliver found? false))})
@found?))
(defn update-bounty-token-balances
"Helper function for updating internal ERC20 token balances to token
@ -400,6 +461,7 @@
(run-tasks
[deploy-pending-contracts
update-issue-contract-address
update-confirm-hashes
update-payout-receipts
update-revoked-payout-receipts
update-watch-hash
@ -441,40 +503,3 @@
(log/info "stopping scheduler")
(scheduler)))
(defn contract-confirmation-logs [contract-address]
"retrives all log events for the confirmation topic since contract creation"
(some-> contract-address
issues/get-issue-by-contract-address
:transaction_hash
eth/get-transaction-by-hash
:blockNumber
(eth/get-logs contract-address [(:confirmation multisig/topics)])))
(defn hash-in-logs?
"return true if the transaction hash is present in the queryable blockchain"
[hash logs]
(some #(= hash (:transactionHash %)) logs))
(defn execution-status [execute-hash contract-address]
"check to see if a given execute-hash has been confirmed"
(log/infof "checking contract for logs containing %s" execute-hash)
(let [logs (contract-confirmation-logs contract-address)]
(hash-in-logs? execute-hash logs)))
(defn poll-transaction-logs [execute-hash contract-address]
"check for execution hash in logs for a few minutes"
(let [found? (promise)
intervals (take 6
(periodic-seq (t/now)
(t/seconds 30)))]
;; polling will be slow but if we want to move to an event driven
;; model then we can listen for events, rather than logs, once we're
;; using a geth node again
(chime-at intervals
(fn [time]
(when (execution-status execute-hash contract-address)
(deliver found? true)))
{:on-finished (fn []
(deliver found? false))})
@found?))