Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit 11b5efb

Browse files
committed
fix for issue #146; mark header checked for contract if it doesnt have
any logs at that header but other contracts do; test
1 parent 3fff289 commit 11b5efb

File tree

4 files changed

+54
-16
lines changed

4 files changed

+54
-16
lines changed

integration_test/contract_watcher_header_sync_transformer_test.go

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ var _ = Describe("contractWatcher headerSync transformer", func() {
4040
var blockChain core.BlockChain
4141
var headerRepository repositories.HeaderRepository
4242
var headerID int64
43-
var ensAddr = strings.ToLower(constants.EnsContractAddress)
44-
var tusdAddr = strings.ToLower(constants.TusdContractAddress)
43+
var ensAddr = strings.ToLower(constants.EnsContractAddress) // 0x314159265dd8dbb310642f98f50c066173c1259b
44+
var tusdAddr = strings.ToLower(constants.TusdContractAddress) // 0x8dd5fbce2f6a956c3022ba3663759011dd51e73e
4545

4646
BeforeEach(func() {
4747
db, blockChain = test_helpers.SetupDBandBC()
@@ -377,6 +377,42 @@ var _ = Describe("contractWatcher headerSync transformer", func() {
377377
Expect(transferLog.Value).To(Equal("2800000000000000000000"))
378378
})
379379

380+
It("Marks header checked for a contract that has no logs at that header", func() {
381+
t := transformer.NewTransformer(test_helpers.ENSandTusdConfig, blockChain, db)
382+
err = t.Init()
383+
Expect(err).ToNot(HaveOccurred())
384+
err = t.Execute()
385+
Expect(err).ToNot(HaveOccurred())
386+
Expect(t.Start).To(Equal(int64(6885702)))
387+
388+
newOwnerLog := test_helpers.HeaderSyncNewOwnerLog{}
389+
err = db.QueryRowx(fmt.Sprintf("SELECT * FROM header_%s.newowner_event", ensAddr)).StructScan(&newOwnerLog)
390+
Expect(err).ToNot(HaveOccurred())
391+
transferLog := test_helpers.HeaderSyncTransferLog{}
392+
err = db.QueryRowx(fmt.Sprintf("SELECT * FROM header_%s.transfer_event", tusdAddr)).StructScan(&transferLog)
393+
Expect(err).ToNot(HaveOccurred())
394+
Expect(transferLog.HeaderID).ToNot(Equal(newOwnerLog.HeaderID))
395+
396+
type checkedHeader struct {
397+
ID int64 `db:"id"`
398+
HeaderID int64 `db:"header_id"`
399+
NewOwner int64 `db:"newowner_0x314159265dd8dbb310642f98f50c066173c1259b"`
400+
Transfer int64 `db:"transfer_0x8dd5fbce2f6a956c3022ba3663759011dd51e73e"`
401+
}
402+
403+
transferCheckedHeader := new(checkedHeader)
404+
err = db.QueryRowx("SELECT * FROM public.checked_headers WHERE header_id = $1", transferLog.HeaderID).StructScan(transferCheckedHeader)
405+
Expect(err).ToNot(HaveOccurred())
406+
Expect(transferCheckedHeader.Transfer).To(Equal(int64(1)))
407+
Expect(transferCheckedHeader.NewOwner).To(Equal(int64(1)))
408+
409+
newOwnerCheckedHeader := new(checkedHeader)
410+
err = db.QueryRowx("SELECT * FROM public.checked_headers WHERE header_id = $1", newOwnerLog.HeaderID).StructScan(newOwnerCheckedHeader)
411+
Expect(err).ToNot(HaveOccurred())
412+
Expect(newOwnerCheckedHeader.NewOwner).To(Equal(int64(1)))
413+
Expect(newOwnerCheckedHeader.Transfer).To(Equal(int64(1)))
414+
})
415+
380416
It("Keeps track of contract-related hashes and addresses while transforming event data if they need to be used for later method polling", func() {
381417
var testConf config.ContractConfig
382418
testConf = test_helpers.ENSandTusdConfig

pkg/contract_watcher/header/repository/header_repository.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"fmt"
2121

2222
"github.com/hashicorp/golang-lru"
23-
"github.com/jmoiron/sqlx"
2423
"github.com/sirupsen/logrus"
2524

2625
"github.com/vulcanize/vulcanizedb/pkg/core"
@@ -268,12 +267,3 @@ func continuousHeaders(headers []core.Header) []core.Header {
268267
func (r *headerRepository) CheckCache(key string) (interface{}, bool) {
269268
return r.columns.Get(key)
270269
}
271-
272-
// Used to mark a header checked as part of some external transaction so as to group into one commit
273-
func (r *headerRepository) MarkHeaderCheckedInTransaction(headerID int64, tx *sqlx.Tx, eventID string) error {
274-
_, err := tx.Exec(`INSERT INTO public.checked_headers (header_id, `+eventID+`)
275-
VALUES ($1, $2)
276-
ON CONFLICT (header_id) DO
277-
UPDATE SET `+eventID+` = checked_headers.`+eventID+` + 1`, headerID, 1)
278-
return err
279-
}

pkg/contract_watcher/header/transformer/transformer.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,19 +249,32 @@ func (tr *Transformer) Execute() error {
249249
}
250250

251251
// Sort logs by the contract they belong to
252+
// Start by adding every contract addr to the map
253+
// So that if we don't have any logs for it, it is caught and the header is still marked checked for its events
254+
for _, addr := range tr.contractAddresses {
255+
sortedLogs[addr] = nil
256+
}
252257
for _, log := range allLogs {
253258
addr := strings.ToLower(log.Address.Hex())
254259
sortedLogs[addr] = append(sortedLogs[addr], log)
255260
}
256261

257262
// Process logs for each contract
258263
for conAddr, logs := range sortedLogs {
259-
if logs == nil {
264+
con := tr.Contracts[conAddr]
265+
if len(logs) < 1 {
266+
eventIds := make([]string, 0)
267+
for eventName := range con.Events {
268+
eventIds = append(eventIds, strings.ToLower(eventName+"_"+con.Address))
269+
}
270+
markCheckedErr := tr.HeaderRepository.MarkHeaderCheckedForAll(header.Id, eventIds)
271+
if markCheckedErr != nil {
272+
return fmt.Errorf("error marking header checked: %s", markCheckedErr.Error())
273+
}
260274
logrus.Tracef("no logs found for contract %s at block %d, continuing", conAddr, header.BlockNumber)
261275
continue
262276
}
263277
// Configure converter with this contract
264-
con := tr.Contracts[conAddr]
265278
tr.Converter.Update(con)
266279

267280
// Convert logs into batches of log mappings (eventName => []types.Logs

pkg/contract_watcher/shared/helpers/test_helpers/database.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,7 @@ func TearDown(db *postgres.DB) {
294294

295295
_, err = tx.Exec(`CREATE TABLE checked_headers (
296296
id SERIAL PRIMARY KEY,
297-
header_id INTEGER UNIQUE NOT NULL REFERENCES headers (id) ON DELETE CASCADE,
298-
check_count INTEGER NOT NULL DEFAULT 1);`)
297+
header_id INTEGER UNIQUE NOT NULL REFERENCES headers (id) ON DELETE CASCADE);`)
299298
Expect(err).NotTo(HaveOccurred())
300299

301300
_, err = tx.Exec(`DROP SCHEMA IF EXISTS full_0x8dd5fbce2f6a956c3022ba3663759011dd51e73e CASCADE`)

0 commit comments

Comments
 (0)