github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/vent/sqlsol/generate.go (about)

     1  package sqlsol
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/hyperledger/burrow/execution/evm/abi"
     7  	"github.com/hyperledger/burrow/vent/types"
     8  )
     9  
    10  // GenerateSpecFromAbis creates a simple spec which just logs all events
    11  func GenerateSpecFromAbis(spec *abi.Spec) ([]*types.EventClass, error) {
    12  	type field struct {
    13  		Type   abi.EVMType
    14  		Events []string
    15  	}
    16  
    17  	fields := make(map[string]field)
    18  
    19  	for _, ev := range spec.EventsByID {
    20  		for _, in := range ev.Inputs {
    21  			field, ok := fields[in.Name]
    22  			if ok {
    23  				if field.Type != in.EVM {
    24  					if field.Type.ImplicitCast(in.EVM) {
    25  						field.Type = in.EVM
    26  					} else if !in.EVM.ImplicitCast(field.Type) {
    27  						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)
    28  					}
    29  				} else {
    30  					field.Events = append(field.Events, ev.Name)
    31  				}
    32  			} else {
    33  				field.Type = in.EVM
    34  				field.Events = []string{ev.Name}
    35  			}
    36  			fields[in.Name] = field
    37  		}
    38  	}
    39  
    40  	ev := types.EventClass{
    41  		TableName:     "event",
    42  		Filter:        "EventType = 'LogEvent'",
    43  		FieldMappings: make([]*types.EventFieldMapping, len(fields)),
    44  	}
    45  
    46  	i := 0
    47  
    48  	for name, field := range fields {
    49  		ev.FieldMappings[i] = &types.EventFieldMapping{
    50  			Field:      name,
    51  			ColumnName: name,
    52  			Type:       field.Type.GetSignature(),
    53  			Primary:    false,
    54  		}
    55  		i++
    56  	}
    57  
    58  	return []*types.EventClass{&ev}, nil
    59  }