forked from hyperledger-archives/burrow
-
Notifications
You must be signed in to change notification settings - Fork 0
/
generate.go
59 lines (50 loc) · 1.37 KB
/
generate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package sqlsol
import (
"fmt"
"github.com/hyperledger/burrow/execution/evm/abi"
"github.com/hyperledger/burrow/vent/types"
)
// GenerateSpecFromAbis creates a simple spec which just logs all events
func GenerateSpecFromAbis(spec *abi.Spec) ([]*types.EventClass, error) {
type field struct {
Type abi.EVMType
Events []string
}
fields := make(map[string]field)
for _, ev := range spec.EventsByID {
for _, in := range ev.Inputs {
field, ok := fields[in.Name]
if ok {
if field.Type != in.EVM {
if field.Type.ImplicitCast(in.EVM) {
field.Type = in.EVM
} else if !in.EVM.ImplicitCast(field.Type) {
fmt.Printf("WARNING: field %s in event %s has different definitions in events %v (%s rather than %s)\n", in.Name, ev.Name, field.Events, field.Type, in.EVM)
}
} else {
field.Events = append(field.Events, ev.Name)
}
} else {
field.Type = in.EVM
field.Events = []string{ev.Name}
}
fields[in.Name] = field
}
}
ev := types.EventClass{
TableName: "event",
Filter: "EventType = 'LogEvent'",
FieldMappings: make([]*types.EventFieldMapping, len(fields)),
}
i := 0
for name, field := range fields {
ev.FieldMappings[i] = &types.EventFieldMapping{
Field: name,
ColumnName: name,
Type: field.Type.GetSignature(),
Primary: false,
}
i++
}
return []*types.EventClass{&ev}, nil
}