work on erc20 event_triggered functionality and generic helper for log unpacking and converting. helpers.ConvertToLog and helpers.createTopics have been adjusted to be variadic to work with event logs with any number of topics. Also uncovered issue with Dai and TrueUSD that means they doesn't really conform to the ERC20 standard. this is because they named their arguments to standard events like Approval and Trasnfer differently (e.g. Approval(src address, guy address, wad uint) and Approval(owner address, spender address, value uint) instead of the standard which is Approval(tokenOwner address, spender address, tokens uint)). This causes incompatibility with generic ERC20 entities and converters for these events.

This commit is contained in:
Ian Norden 2018-08-26 21:55:09 -05:00
parent 44e0a8d303
commit 55a73c5797
17 changed files with 613 additions and 13 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,106 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package event_triggered
import (
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/vulcanize/vulcanizedb/examples/generic"
"github.com/vulcanize/vulcanizedb/examples/generic/helpers"
"github.com/vulcanize/vulcanizedb/pkg/core"
)
type ERC20ConverterInterface interface {
ToTransferEntity(watchedEvent core.WatchedEvent) (*TransferEntity, error)
ToTransferModel(entity TransferEntity) TransferModel
ToApprovalEntity(watchedEvent core.WatchedEvent) (*ApprovalEntity, error)
ToApprovalModel(entity ApprovalEntity) ApprovalModel
}
type ERC20Converter struct {
config generic.ContractConfig
}
func NewERC20Converter(config generic.ContractConfig) ERC20Converter {
return ERC20Converter{
config: config,
}
}
func (c ERC20Converter) ToTransferEntity(watchedEvent core.WatchedEvent) (*TransferEntity, error) {
result := &TransferEntity{}
contract := bind.NewBoundContract(common.HexToAddress(c.config.Address), c.config.ParsedAbi, nil, nil, nil)
event := helpers.ConvertToLog(watchedEvent)
err := contract.UnpackLog(result, "Transfer", event)
if err != nil {
return result, err
}
result.TokenName = c.config.Name
result.TokenAddress = common.HexToAddress(c.config.Address)
result.Block = watchedEvent.BlockNumber
result.TxHash = watchedEvent.TxHash
return result, nil
}
func (c ERC20Converter) ToTransferModel(transferEntity TransferEntity) TransferModel {
to := transferEntity.Dst.String()
from := transferEntity.Src.String()
tokens := transferEntity.Wad.String()
block := transferEntity.Block
tx := transferEntity.TxHash
return TransferModel{
TokenName: c.config.Name,
TokenAddress: c.config.Address,
To: to,
From: from,
Tokens: tokens,
Block: block,
TxHash: tx,
}
}
func (c ERC20Converter) ToApprovalEntity(watchedEvent core.WatchedEvent) (*ApprovalEntity, error) {
result := &ApprovalEntity{}
contract := bind.NewBoundContract(common.HexToAddress(c.config.Address), c.config.ParsedAbi, nil, nil, nil)
event := helpers.ConvertToLog(watchedEvent)
err := contract.UnpackLog(result, "Approval", event)
if err != nil {
return result, err
}
result.TokenName = c.config.Name
result.TokenAddress = common.HexToAddress(c.config.Address)
result.Block = watchedEvent.BlockNumber
result.TxHash = watchedEvent.TxHash
return result, nil
}
func (c ERC20Converter) ToApprovalModel(TransferEntity ApprovalEntity) ApprovalModel {
tokenOwner := TransferEntity.Src.String()
spender := TransferEntity.Guy.String()
tokens := TransferEntity.Wad.String()
block := TransferEntity.Block
tx := TransferEntity.TxHash
return ApprovalModel{
TokenName: c.config.Name,
TokenAddress: c.config.Address,
Owner: tokenOwner,
Spender: spender,
Tokens: tokens,
Block: block,
TxHash: tx,
}
}

View File

@ -0,0 +1,173 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package event_triggered_test
import (
"github.com/ethereum/go-ethereum/common"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/vulcanize/vulcanizedb/examples/constants"
"github.com/vulcanize/vulcanizedb/examples/erc20_watcher/event_triggered"
"github.com/vulcanize/vulcanizedb/examples/generic"
"github.com/vulcanize/vulcanizedb/pkg/core"
"math/big"
)
var expectedTransferModel = event_triggered.TransferModel{
TokenName: "Dai",
TokenAddress: "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359",
To: "0x09BbBBE21a5975cAc061D82f7b843bCE061BA391",
From: "0x000000000000000000000000000000000000Af21",
Tokens: "1097077688018008265106216665536940668749033598146",
Block: 5488076,
TxHash: "0x135391a0962a63944e5908e6fedfff90fb4be3e3290a21017861099bad6546ae",
}
var transferWad, approvalWad big.Int
var expectedTransferEntity = event_triggered.TransferEntity{
TokenName: "Dai",
TokenAddress: common.HexToAddress("0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359"),
Src: common.HexToAddress("0x000000000000000000000000000000000000Af21"),
Dst: common.HexToAddress("0x09BbBBE21a5975cAc061D82f7b843bCE061BA391"),
Wad: &transferWad,
Block: 5488076,
TxHash: "0x135391a0962a63944e5908e6fedfff90fb4be3e3290a21017861099bad6546ae",
}
var expectedApprovalModel = event_triggered.ApprovalModel{
TokenName: "Dai",
TokenAddress: "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359",
Owner: "0x000000000000000000000000000000000000Af21",
Spender: "0x09BbBBE21a5975cAc061D82f7b843bCE061BA391",
Tokens: "1097077688018008265106216665536940668749033598146",
Block: 5488076,
TxHash: "0x135391a0962a63944e5908e6fedfff90fb4be3e3290a21017861099bad6546ae",
}
var expectedApprovalEntity = event_triggered.ApprovalEntity{
TokenName: "Dai",
TokenAddress: common.HexToAddress("0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359"),
Src: common.HexToAddress("0x000000000000000000000000000000000000Af21"),
Guy: common.HexToAddress("0x09BbBBE21a5975cAc061D82f7b843bCE061BA391"),
Wad: &approvalWad,
Block: 5488076,
TxHash: "0x135391a0962a63944e5908e6fedfff90fb4be3e3290a21017861099bad6546ae",
}
var transferEvent = core.WatchedEvent{
LogID: 1,
Name: "Dai",
BlockNumber: 5488076,
Address: constants.DaiContractAddress,
TxHash: "0x135391a0962a63944e5908e6fedfff90fb4be3e3290a21017861099bad6546ae",
Index: 110,
Topic0: constants.TransferEventSignature,
Topic1: "0x000000000000000000000000000000000000000000000000000000000000af21",
Topic2: "0x9dd48110dcc444fdc242510c09bbbbe21a5975cac061d82f7b843bce061ba391",
Topic3: "",
Data: "0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359000000000000000000000000000000000000000000000000392d2e2bda9c00000000000000000000000000000000000000000000000000927f41fa0a4a418000000000000000000000000000000000000000000000000000000000005adcfebe",
}
var approvalEvent = core.WatchedEvent{
LogID: 1,
Name: "Dai",
BlockNumber: 5488076,
Address: constants.DaiContractAddress,
TxHash: "0x135391a0962a63944e5908e6fedfff90fb4be3e3290a21017861099bad6546ae",
Index: 110,
Topic0: constants.TransferEventSignature,
Topic1: "0x000000000000000000000000000000000000000000000000000000000000af21",
Topic2: "0x9dd48110dcc444fdc242510c09bbbbe21a5975cac061d82f7b843bce061ba391",
Topic3: "",
Data: "0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359000000000000000000000000000000000000000000000000392d2e2bda9c00000000000000000000000000000000000000000000000000927f41fa0a4a418000000000000000000000000000000000000000000000000000000000005adcfebe",
}
var _ = Describe("Transfer Converter", func() {
daiConverter := event_triggered.NewERC20Converter(generic.DaiConfig)
It("converts a watched transfer event into a TransferEntity", func() {
result, err := daiConverter.ToTransferEntity(transferEvent)
Expect(err).NotTo(HaveOccurred())
Expect(result.TokenName).To(Equal(expectedTransferEntity.TokenName))
Expect(result.TokenAddress).To(Equal(expectedTransferEntity.TokenAddress))
Expect(result.Dst).To(Equal(expectedTransferEntity.Dst))
Expect(result.Src).To(Equal(expectedTransferEntity.Src))
Expect(result.Wad).To(Equal(expectedTransferEntity.Wad))
Expect(result.Block).To(Equal(expectedTransferEntity.Block))
Expect(result.TxHash).To(Equal(expectedTransferEntity.TxHash))
})
It("converts a TransferEntity to an TransferModel", func() {
result, err := daiConverter.ToTransferEntity(transferEvent)
Expect(err).NotTo(HaveOccurred())
model := daiConverter.ToTransferModel(*result)
Expect(model.TokenName).To(Equal(expectedTransferModel.TokenName))
Expect(model.TokenAddress).To(Equal(expectedTransferModel.TokenAddress))
Expect(model.To).To(Equal(expectedTransferModel.To))
Expect(model.From).To(Equal(expectedTransferModel.From))
Expect(model.Tokens).To(Equal(expectedTransferModel.Tokens))
Expect(model.Block).To(Equal(expectedTransferModel.Block))
Expect(model.TxHash).To(Equal(expectedTransferModel.TxHash))
})
})
var _ = Describe("Approval Converter", func() {
daiConverter := event_triggered.NewERC20Converter(generic.DaiConfig)
It("converts a watched approval event into a ApprovalEntity", func() {
result, err := daiConverter.ToApprovalEntity(approvalEvent)
Expect(err).NotTo(HaveOccurred())
Expect(result.TokenName).To(Equal(expectedApprovalEntity.TokenName))
Expect(result.TokenAddress).To(Equal(expectedApprovalEntity.TokenAddress))
Expect(result.Src).To(Equal(expectedApprovalEntity.Src))
Expect(result.Guy).To(Equal(expectedApprovalEntity.Guy))
Expect(result.Wad).To(Equal(expectedApprovalEntity.Wad))
Expect(result.Block).To(Equal(expectedApprovalEntity.Block))
Expect(result.TxHash).To(Equal(expectedApprovalEntity.TxHash))
})
It("converts a ApprovalEntity to an ApprovalModel", func() {
result, err := daiConverter.ToApprovalEntity(approvalEvent)
Expect(err).NotTo(HaveOccurred())
model := daiConverter.ToApprovalModel(*result)
Expect(model.TokenName).To(Equal(expectedApprovalModel.TokenName))
Expect(model.TokenAddress).To(Equal(expectedApprovalModel.TokenAddress))
Expect(model.Owner).To(Equal(expectedApprovalModel.Owner))
Expect(model.Spender).To(Equal(expectedApprovalModel.Spender))
Expect(model.Tokens).To(Equal(expectedApprovalModel.Tokens))
Expect(model.Block).To(Equal(expectedApprovalModel.Block))
Expect(model.TxHash).To(Equal(expectedApprovalModel.TxHash))
})
})
func init() {
transferWad.SetString("1097077688018008265106216665536940668749033598146", 10)
approvalWad.SetString("1097077688018008265106216665536940668749033598146", 10)
}

View File

@ -0,0 +1,40 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package event_triggered
import (
"github.com/ethereum/go-ethereum/common"
"math/big"
)
type TransferEntity struct {
TokenName string
TokenAddress common.Address
Src common.Address
Dst common.Address
Wad *big.Int
Block int64
TxHash string
}
type ApprovalEntity struct {
TokenName string
TokenAddress common.Address
Src common.Address
Guy common.Address
Wad *big.Int
Block int64
TxHash string
}

View File

@ -0,0 +1,27 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package event_triggered_test
import (
"testing"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
func TestLogKill(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "ERC20 Event Triggered test Suite")
}

View File

@ -0,0 +1,15 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package event_triggered_test

View File

@ -0,0 +1,35 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package event_triggered
type TransferModel struct {
TokenName string
TokenAddress string
To string
From string
Tokens string
Block int64
TxHash string
}
type ApprovalModel struct {
TokenName string
TokenAddress string
Owner string
Spender string
Tokens string
Block int64
TxHash string
}

View File

@ -0,0 +1,58 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package event_triggered
import (
"github.com/vulcanize/vulcanizedb/pkg/datastore/postgres"
)
type Datastore interface {
CreateTransfer(model TransferModel, vulcanizeLogId int64) error
CreateApproval(model ApprovalModel, vulcanizeLogId int64) error
}
type Repository struct {
*postgres.DB
}
func (repository Repository) CreateTransfer(transferModel TransferModel, vulcanizeLogId int64) error {
_, err := repository.DB.Exec(
`INSERT INTO TRANSFERS (vulcanize_log_id, token_address, to, from, tokens, block, tx)
VALUES ($1, $2, $3, $4, $5, $6, $7)
ON CONFLICT (vulcanize_log_id) DO NOTHING`,
vulcanizeLogId, transferModel.TokenAddress, transferModel.To, transferModel.From, transferModel.Tokens, transferModel.Block, transferModel.TxHash)
if err != nil {
return err
}
return nil
}
func (repository Repository) CreateApproval(approvalModel ApprovalModel, vulcanizeLogId int64) error {
_, err := repository.DB.Exec(
`INSERT INTO APPROVALS (vulcanize_log_id, token_address, token_owner, token_spender, tokens, block, tx)
VALUES ($1, $2, $3, $4, $5, $6, $7)
ON CONFLICT (vulcanize_log_id) DO NOTHING`,
vulcanizeLogId, approvalModel.TokenAddress, approvalModel.Owner, approvalModel.Spender, approvalModel.Tokens, approvalModel.Block, approvalModel.TxHash)
if err != nil {
return err
}
return nil
}

View File

@ -0,0 +1,15 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package event_triggered_test

View File

@ -0,0 +1,15 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package event_triggered

View File

@ -0,0 +1,15 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package event_triggered_test

View File

@ -18,8 +18,8 @@ import (
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"github.com/vulcanize/vulcanizedb/examples/constants" "github.com/vulcanize/vulcanizedb/examples/constants"
"github.com/vulcanize/vulcanizedb/examples/erc20_watcher"
"github.com/vulcanize/vulcanizedb/examples/erc20_watcher/every_block" "github.com/vulcanize/vulcanizedb/examples/erc20_watcher/every_block"
"github.com/vulcanize/vulcanizedb/examples/generic"
"github.com/vulcanize/vulcanizedb/examples/test_helpers" "github.com/vulcanize/vulcanizedb/examples/test_helpers"
"github.com/vulcanize/vulcanizedb/pkg/core" "github.com/vulcanize/vulcanizedb/pkg/core"
"github.com/vulcanize/vulcanizedb/pkg/datastore/postgres" "github.com/vulcanize/vulcanizedb/pkg/datastore/postgres"
@ -45,7 +45,7 @@ var _ = Describe("Everyblock transformers", func() {
BeforeEach(func() { BeforeEach(func() {
blockChain = fakes.NewMockBlockChain() blockChain = fakes.NewMockBlockChain()
blockNumber = erc20_watcher.DaiConfig.FirstBlock blockNumber = generic.DaiConfig.FirstBlock
lastBlockNumber := blockNumber + 1 lastBlockNumber := blockNumber + 1
db = test_helpers.CreateNewDatabase() db = test_helpers.CreateNewDatabase()
setLastBlockOnChain(blockChain, lastBlockNumber) setLastBlockOnChain(blockChain, lastBlockNumber)
@ -59,7 +59,7 @@ var _ = Describe("Everyblock transformers", func() {
}) })
It("creates a token_supply record for each block in the given range", func() { It("creates a token_supply record for each block in the given range", func() {
initializer := every_block.ERC20TokenTransformerInitializer{Config: erc20_watcher.DaiConfig} initializer := every_block.ERC20TokenTransformerInitializer{Config: generic.DaiConfig}
transformer := initializer.NewERC20TokenTransformer(db, blockChain) transformer := initializer.NewERC20TokenTransformer(db, blockChain)
transformer.Execute() transformer.Execute()

View File

@ -17,7 +17,6 @@ package every_block
import ( import (
"fmt" "fmt"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/vulcanize/vulcanizedb/examples/erc20_watcher"
"github.com/vulcanize/vulcanizedb/examples/generic" "github.com/vulcanize/vulcanizedb/examples/generic"
"github.com/vulcanize/vulcanizedb/libraries/shared" "github.com/vulcanize/vulcanizedb/libraries/shared"
"github.com/vulcanize/vulcanizedb/pkg/core" "github.com/vulcanize/vulcanizedb/pkg/core"
@ -30,15 +29,15 @@ type Transformer struct {
Getter ERC20GetterInterface Getter ERC20GetterInterface
Repository ERC20RepositoryInterface Repository ERC20RepositoryInterface
Retriever generic.Retriever Retriever generic.Retriever
Config erc20_watcher.ContractConfig Config generic.ContractConfig
} }
func (t *Transformer) SetConfiguration(config erc20_watcher.ContractConfig) { func (t *Transformer) SetConfiguration(config generic.ContractConfig) {
t.Config = config t.Config = config
} }
type ERC20TokenTransformerInitializer struct { type ERC20TokenTransformerInitializer struct {
Config erc20_watcher.ContractConfig Config generic.ContractConfig
} }
func (i ERC20TokenTransformerInitializer) NewERC20TokenTransformer(db *postgres.DB, blockchain core.BlockChain) shared.Transformer { func (i ERC20TokenTransformerInitializer) NewERC20TokenTransformer(db *postgres.DB, blockchain core.BlockChain) shared.Transformer {

View File

@ -18,7 +18,6 @@ import (
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"github.com/vulcanize/vulcanizedb/examples/constants" "github.com/vulcanize/vulcanizedb/examples/constants"
"github.com/vulcanize/vulcanizedb/examples/erc20_watcher"
"github.com/vulcanize/vulcanizedb/examples/erc20_watcher/every_block" "github.com/vulcanize/vulcanizedb/examples/erc20_watcher/every_block"
"github.com/vulcanize/vulcanizedb/examples/generic" "github.com/vulcanize/vulcanizedb/examples/generic"
"github.com/vulcanize/vulcanizedb/examples/mocks" "github.com/vulcanize/vulcanizedb/examples/mocks"
@ -29,7 +28,7 @@ import (
"strconv" "strconv"
) )
var testContractConfig = erc20_watcher.ContractConfig{ var testContractConfig = generic.ContractConfig{
Address: constants.DaiContractAddress, Address: constants.DaiContractAddress,
Abi: constants.DaiAbiString, Abi: constants.DaiAbiString,
FirstBlock: int64(4752008), FirstBlock: int64(4752008),

View File

@ -15,12 +15,12 @@
package every_block package every_block
import ( import (
"github.com/vulcanize/vulcanizedb/examples/erc20_watcher" "github.com/vulcanize/vulcanizedb/examples/generic"
"github.com/vulcanize/vulcanizedb/libraries/shared" "github.com/vulcanize/vulcanizedb/libraries/shared"
) )
func TransformerInitializers() []shared.TransformerInitializer { func TransformerInitializers() []shared.TransformerInitializer {
config := erc20_watcher.DaiConfig config := generic.DaiConfig
initializer := ERC20TokenTransformerInitializer{config} initializer := ERC20TokenTransformerInitializer{config}
return []shared.TransformerInitializer{ return []shared.TransformerInitializer{
initializer.NewERC20TokenTransformer, initializer.NewERC20TokenTransformer,

View File

@ -12,13 +12,17 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
package erc20_watcher package generic
import "github.com/vulcanize/vulcanizedb/examples/constants" import (
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/vulcanize/vulcanizedb/examples/constants"
)
type ContractConfig struct { type ContractConfig struct {
Address string Address string
Abi string Abi string
ParsedAbi abi.ABI
FirstBlock int64 FirstBlock int64
LastBlock int64 LastBlock int64
Name string Name string
@ -27,6 +31,7 @@ type ContractConfig struct {
var DaiConfig = ContractConfig{ var DaiConfig = ContractConfig{
Address: constants.DaiContractAddress, Address: constants.DaiContractAddress,
Abi: constants.DaiAbiString, Abi: constants.DaiAbiString,
ParsedAbi: constants.ParsedDaiAbi,
FirstBlock: int64(4752008), FirstBlock: int64(4752008),
LastBlock: -1, LastBlock: -1,
Name: "Dai", Name: "Dai",

View File

@ -0,0 +1,66 @@
// Copyright 2018 Vulcanize
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package helpers
import (
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/vulcanize/vulcanizedb/pkg/core"
)
func ConvertToLog(watchedEvent core.WatchedEvent) types.Log {
allTopics := []string{watchedEvent.Topic0, watchedEvent.Topic1, watchedEvent.Topic2, watchedEvent.Topic3}
var nonNilTopics []string
for _, topic := range allTopics {
if topic != "" {
nonNilTopics = append(nonNilTopics, topic)
}
}
return types.Log{
Address: common.HexToAddress(watchedEvent.Address),
Topics: createTopics(nonNilTopics...),
Data: hexutil.MustDecode(watchedEvent.Data),
BlockNumber: uint64(watchedEvent.BlockNumber),
TxHash: common.HexToHash(watchedEvent.TxHash),
TxIndex: 0,
BlockHash: common.HexToHash("0x0"),
Index: uint(watchedEvent.Index),
Removed: false,
}
}
func createTopics(topics ...string) []common.Hash {
var topicsArray []common.Hash
for _, topic := range topics {
topicsArray = append(topicsArray, common.HexToHash(topic))
}
return topicsArray
}
func BigFromString(n string) *big.Int {
b := new(big.Int)
b.SetString(n, 10)
return b
}
func GenerateSignature(s string) string {
eventSignature := []byte(s)
hash := crypto.Keccak256Hash(eventSignature)
return hash.Hex()
}