Skip to content
This repository was archived by the owner on Dec 12, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib_version.clj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(ns lib-version)

(def lib 'district0x/district-server-smart-contracts) ; ends up as <group-id>/<artifact-id> in pom.xml
(def version "1.4.2-SNAPSHOT")
(def version "1.4.3-SNAPSHOT")
38 changes: 30 additions & 8 deletions src/district/server/smart_contracts.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -261,20 +261,42 @@
identity)]
(transform-fn (remove-log-indexes sorted-logs))))

(defn get-events-with-retry [contract-instance contract event from to ch-logs retry-count]
(web3-eth/get-past-events contract-instance
event
{:from-block from
:to-block to}
(fn [error events]
(if (and error (< retry-count 10))
(do
(let [wait-time (int (* 500 (inc retry-count) (inc (rand))))]
(log/info "Error fetching events. Retrying" {:retry-count retry-count
:contract contract
:event event
:from from
:to to
:error error
:wait-time wait-time})
(js/setTimeout
(fn []
(get-events-with-retry contract-instance contract event from to ch-logs (inc retry-count)))
wait-time)))
(let [logs (->> events
web3-helpers/js->cljkk
(map (partial enrich-event-log contract contract-instance)))]
(async/put! ch-logs (if error [(with-meta {:err error} {:error? true})] logs)))))))

(defn chunk->logs [transform-fn from-block skip-log-indexes events ignore-forward? [from to] ch-output]
">! to ch-output for chunk [from to]: final sorted, skipped and transformed logs as async/ch."
(let [sort-and-skip-logs' (partial sort-and-skip-logs transform-fn from-block skip-log-indexes)
ch-logs (async/chan 1)
event->logs (fn [[k [contract event]] ch-logs-output]
(let [contract-instance (instance-from-arg contract {:ignore-forward? ignore-forward?})]
(web3-eth/get-past-events contract-instance
event
{:from-block from
:to-block to}
(fn [error events]
(let [logs (map (partial enrich-event-log contract contract-instance)
(web3-helpers/js->cljkk events))]
(async/put! ch-logs-output (or logs [(with-meta {:err error} {:error? true})])))))))]
(log/debug "Processing chunk of blocks" {:contract contract
:event event
:from from
:to to})
(get-events-with-retry contract-instance contract event from to ch-logs-output 0)))]
(go-loop [all-logs []
[event & rest-events] events]
(if event
Expand Down
12 changes: 10 additions & 2 deletions test/tests/all.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@
(.unsubscribe event-emitter (fn []))
(done)))))

(deftest test-replay-past-events-in-order
(defn test-replay-past-events-in-order
[chunks-parallelism]
(async done
(go
(let [events {:my-contract/on-counter-incremented [:my-contract :onCounterIncremented]}
Expand All @@ -129,13 +130,20 @@
(->> (map (juxt :block-number :transaction-index :log-index) chunk-logs)
(swap! on-chunk-test concat)))
:on-finish (fn []
(log/debug "Finished replaying past events"))}))
(log/debug "Finished replaying past events"))
:chunks-parallelism chunks-parallelism}))
cleanup-tx (<! (smart-contracts/contract-send :my-contract :set-counter [1] {:gas 5000000}))]
(is (= @captured-events @on-chunk-test [[(+ block-number 1) 0 1] [(+ block-number 2) 0 0] [(+ block-number 2) 0 1]])
"It should filter by from-block and from-tx-lidx")

(done)))))

(deftest test-replay-past-events-in-order-parallel
(test-replay-past-events-in-order 10))

(deftest test-replay-past-events-in-order-sequential
(test-replay-past-events-in-order 1))

(deftest test-contract-send-output-interface
(async done
(go
Expand Down