-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
gun.go
79 lines (68 loc) · 1.89 KB
/
gun.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
78
79
package logpoller
import (
"fmt"
"sync"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/rs/zerolog"
"github.com/smartcontractkit/wasp"
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
)
/* LogEmitterGun is a gun that constantly emits logs from a contract */
type LogEmitterGun struct {
contract *contracts.LogEmitter
eventsToEmit []abi.Event
logger zerolog.Logger
eventsPerTx int
}
type Counter struct {
mu *sync.Mutex
value int
}
func NewLogEmitterGun(
contract *contracts.LogEmitter,
eventsToEmit []abi.Event,
eventsPerTx int,
logger zerolog.Logger,
) *LogEmitterGun {
return &LogEmitterGun{
contract: contract,
eventsToEmit: eventsToEmit,
eventsPerTx: eventsPerTx,
logger: logger,
}
}
func (m *LogEmitterGun) Call(l *wasp.Generator) *wasp.Response {
localCounter := 0
logEmitter := (*m.contract)
address := logEmitter.Address()
for _, event := range m.eventsToEmit {
m.logger.Debug().Str("Emitter address", address.String()).Str("Event type", event.Name).Msg("Emitting log from emitter")
var err error
switch event.Name {
case "Log1":
_, err = logEmitter.EmitLogInts(getIntSlice(m.eventsPerTx))
case "Log2":
_, err = logEmitter.EmitLogIntsIndexed(getIntSlice(m.eventsPerTx))
case "Log3":
_, err = logEmitter.EmitLogStrings(getStringSlice(m.eventsPerTx))
default:
err = fmt.Errorf("unknown event name: %s", event.Name)
}
if err != nil {
return &wasp.Response{Error: err.Error(), Failed: true}
}
localCounter++
}
// I don't think that will work as expected, I should atomically read the value and save it, so maybe just a mutex?
if counter, ok := l.InputSharedData().(*Counter); ok {
counter.mu.Lock()
defer counter.mu.Unlock()
counter.value += localCounter
} else {
return &wasp.Response{
Error: "SharedData did not contain a Counter",
Failed: true,
}
}
return &wasp.Response{}
}