|
9 | 9 | [district.server.async-db :as db] |
10 | 10 | [district.server.smart-contracts :as smart-contracts] |
11 | 11 | [district.time :as time] |
| 12 | + [district.server.config :refer [config]] |
12 | 13 | [district.server.web3 :refer [ping-start ping-stop web3]] |
13 | 14 | [district.server.web3-events :as web3-events] |
14 | 15 | [district.shared.async-helpers :refer [<? safe-go]] |
| 16 | + [ethlance.server.db :as ethlance-db] |
15 | 17 | [ethlance.server.event-replay-queue :as replay-queue] |
16 | 18 | [ethlance.server.tracing.api :as t-api] |
17 | 19 | [ethlance.server.syncer.handlers :as handlers] |
|
24 | 26 |
|
25 | 27 |
|
26 | 28 | (defstate ^{:on-reload :noop} syncer |
27 | | - :start (start {}) |
28 | | - :stop (stop syncer)) |
| 29 | + :start (start (merge (:syncer @config) |
| 30 | + (:syncer (mount/args)))) |
| 31 | + :stop (stop)) |
29 | 32 |
|
30 | 33 |
|
31 | 34 | ;; |
|
60 | 63 | (async/go |
61 | 64 | (let [contract-key (-> event :contract :contract-key) |
62 | 65 | event-key (-> event :event) |
| 66 | + event-name (name event-key) |
| 67 | + log-index (-> event :log-index) |
63 | 68 | handler (get contract-ev->handler [contract-key event-key]) |
64 | 69 | span (t-api/start-span (str (name (or contract-key "UnnamedContract")) "." (name (or event-key "UnnamedEvent")))) |
65 | 70 | conn (<? (db/get-connection))] |
|
72 | 77 | (if timestamp |
73 | 78 | (bn/number timestamp) |
74 | 79 | block-timestamp)))) |
75 | | - _ (db/begin-tx conn) |
76 | | - res (t-api/with-span-context span #(handler conn err event)) |
77 | | - _ (db/commit-tx conn)] |
78 | | - (t-api/set-span-ok! span) |
79 | | - ;; Calling a handler can throw or return a go block (when using safe-go) |
80 | | - ;; in the case of async ones, the go block will return the js/Error. |
81 | | - ;; In either cases push the event to the queue, so it can be replayed later |
82 | | - (when (satisfies? ReadPort res) |
83 | | - (let [r (<! res)] |
84 | | - (when (instance? js/Error r) |
85 | | - (throw r)) |
| 80 | + {:keys [:event/last-block-number :event/last-log-index :event/count] |
| 81 | + :or {last-block-number -1 |
| 82 | + last-log-index -1 |
| 83 | + count 0}} (<? (ethlance-db/get-last-event conn (name contract-key) event-name))] |
| 84 | + (log/debug "Handling event..." event) |
| 85 | + (if (or (> block-number last-block-number) |
| 86 | + (and (= block-number last-block-number) (> log-index last-log-index))) |
| 87 | + (let [_ (db/begin-tx conn) |
| 88 | + res (t-api/with-span-context span #(handler conn err event))] |
86 | 89 | (t-api/set-span-ok! span) |
87 | | - (t-api/end-span! span) |
88 | | - (log/info "Syncer: OK" r) |
89 | | - r))) |
| 90 | + ;; Calling a handler can throw or return a go block (when using safe-go) |
| 91 | + ;; in the case of async ones, the go block will return the js/Error. |
| 92 | + ;; In either cases push the event to the queue, so it can be replayed later |
| 93 | + (when (satisfies? ReadPort res) |
| 94 | + (let [r (<! res)] |
| 95 | + (when (instance? js/Error r) |
| 96 | + (throw r)) |
| 97 | + (<? (ethlance-db/upsert-event! conn {:event/last-log-index log-index |
| 98 | + :event/last-block-number block-number |
| 99 | + :event/count (inc count) |
| 100 | + :event/event-name event-name |
| 101 | + :event/contract-key (name contract-key)})) |
| 102 | + (db/commit-tx conn) |
| 103 | + (log/info "Handled new event" event) |
| 104 | + (t-api/set-span-ok! span) |
| 105 | + (t-api/end-span! span) |
| 106 | + (log/info "Syncer: OK" r) |
| 107 | + r))) |
| 108 | + (log/info "Skipping handling of a persisted event" event))) |
90 | 109 | (catch js/Error error |
91 | 110 | (log/error "Syncer: ERROR" error) |
92 | 111 | (replay-queue/push-event conn event) |
|
105 | 124 | (let [connected? (true? (<! (web3-eth/is-listening? @web3)))] |
106 | 125 | (when connected? |
107 | 126 | (do |
108 | | - (log/debug (str "disconnecting from provider to force reload. Last block: " @last-block-number)) |
| 127 | + (log/debug (str "disconnecting from provider to force reload")) |
109 | 128 | (web3-core/disconnect @web3)))))) |
110 | 129 | interval)) |
111 | 130 |
|
|
0 commit comments