-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathevent.go
77 lines (66 loc) · 2.13 KB
/
event.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package ces
import (
"bytes"
"encoding/hex"
"strings"
"github.com/make-software/casper-go-sdk/v2/casper"
"github.com/make-software/casper-go-sdk/v2/types/clvalue"
"github.com/make-software/casper-go-sdk/v2/types/clvalue/cltype"
)
type ParseResult struct {
Error error
Event Event
}
type Event struct {
ContractHash casper.Hash `json:"contract_hash"`
ContractPackageHash casper.Hash `json:"contract_package_hash"`
RawData string `json:"raw_data"`
Data map[string]casper.CLValue `json:"-"`
Name string `json:"name"`
TransformID uint `json:"transform_id"`
EventID uint `json:"event_id"`
}
// ParseEventNameAndData parse provided rawEvent according to event schema, return EventName and EventData
func ParseEventNameAndData(eventHex string, schemas Schemas) (EventName, map[string]casper.CLValue, error) {
decoded, err := hex.DecodeString(eventHex)
if err != nil {
return "", nil, err
}
dictionary, err := newDictionary(decoded)
if err != nil {
return "", nil, err
}
payload := bytes.NewBuffer(dictionary.DataToBytes())
eventNameWithPrefix, err := clvalue.FromBufferByType(payload, cltype.String)
if err != nil {
return "", nil, err
}
if !strings.HasPrefix(eventNameWithPrefix.String(), eventPrefix) {
return "", nil, ErrNoEventPrefixInEvent
}
eventName := strings.TrimPrefix(eventNameWithPrefix.String(), eventPrefix)
schema, ok := schemas[eventName]
if !ok {
return "", nil, ErrEventNameNotInSchema
}
eventData, err := ParseEventDataFromSchemaBytes(schema, payload)
if err != nil {
return "", nil, err
}
return eventName, eventData, nil
}
func ParseEventDataFromSchemaBytes(schemas []SchemaData, buf *bytes.Buffer) (map[EventName]casper.CLValue, error) {
result := make(map[EventName]casper.CLValue, len(schemas))
var (
one casper.CLValue
err error
)
for _, item := range schemas {
one, err = clvalue.FromBufferByType(buf, item.ParamType)
if err != nil {
return nil, err
}
result[item.ParamName] = one
}
return result, nil
}