/
transmitter.go
112 lines (94 loc) · 3.14 KB
/
transmitter.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package injective
import (
"context"
"encoding/json"
"github.com/pkg/errors"
"github.com/smartcontractkit/libocr/offchainreporting2/types"
log "github.com/xlab/suplog"
"github.com/InjectiveLabs/chainlink-injective/injective/median_report"
chaintypes "github.com/InjectiveLabs/chainlink-injective/injective/types"
chainclient "github.com/InjectiveLabs/sdk-go/chain/client"
)
var _ types.ContractTransmitter = &CosmosModuleTransmitter{}
type CosmosModuleTransmitter struct {
FeedId string
QueryClient chaintypes.QueryClient
CosmosClient chainclient.CosmosClient
ReportCodec median_report.ReportCodec
}
func (c *CosmosModuleTransmitter) FromAccount() types.Account {
return types.Account(c.CosmosClient.FromAddress().String())
}
// Transmit sends the report to the on-chain OCR2Aggregator smart contract's Transmit method
func (c *CosmosModuleTransmitter) Transmit(
ctx context.Context,
reportCtx types.ReportContext,
report types.Report,
signatures []types.AttributedOnchainSignature,
) error {
if len(c.FeedId) == 0 {
err := errors.New("CosmosModuleTransmitter has no FeedId set")
return err
}
// TODO: design how to decouple Cosmos reporting from reportingplugins of OCR2
// The reports are not necessarily numeric (see: titlerequest).
reportRaw, err := c.ReportCodec.ParseReport(report)
if err != nil {
return err
}
msgTransmit := &chaintypes.MsgTransmit{
Transmitter: c.CosmosClient.FromAddress().String(),
ConfigDigest: reportCtx.ConfigDigest[:],
FeedId: c.FeedId,
Epoch: uint64(reportCtx.Epoch),
Round: uint64(reportCtx.Round),
ExtraHash: reportCtx.ExtraHash[:],
Report: &chaintypes.Report{ // chain only understands median.Report for now
ObservationsTimestamp: reportRaw.ObservationsTimestamp,
Observers: reportRaw.Observers,
Observations: reportRaw.Observations,
},
Signatures: make([][]byte, 0, len(signatures)),
}
for _, sig := range signatures {
msgTransmit.Signatures = append(msgTransmit.Signatures, sig.Signature)
}
txResp, err := c.CosmosClient.SyncBroadcastMsg(msgTransmit)
if err != nil {
return err
}
if txResp.Code != 0 {
raw, _ := json.Marshal(txResp)
return errors.Errorf("Cosmos Tx error: %s", string(raw))
}
log.WithFields(log.Fields{
"txHash": txResp.TxHash,
"transmitter": c.CosmosClient.FromAddress().String(),
}).Infoln("🚀 Cosmos Tx successfully sent")
return nil
}
func (c *CosmosModuleTransmitter) LatestConfigDigestAndEpoch(
ctx context.Context,
) (
configDigest types.ConfigDigest,
epoch uint32,
err error,
) {
if len(c.FeedId) == 0 {
err := errors.New("CosmosModuleTransmitter has no FeedId set")
return types.ConfigDigest{}, 0, err
}
if c.QueryClient == nil {
err := errors.New("cannot query LatestConfigDigestAndEpoch: no QueryClient set")
return types.ConfigDigest{}, 0, err
}
resp, err := c.QueryClient.FeedConfigInfo(ctx, &chaintypes.QueryFeedConfigInfoRequest{
FeedId: c.FeedId,
})
if err != nil {
return types.ConfigDigest{}, 0, err
}
configDigest = configDigestFromBytes(resp.FeedConfigInfo.LatestConfigDigest)
epoch = uint32(resp.EpochAndRound.Epoch)
return configDigest, epoch, nil
}