/
contract_transmitter.go
67 lines (57 loc) · 2.24 KB
/
contract_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
package offchainreporting
import (
"context"
"time"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
gethCommon "github.com/ethereum/go-ethereum/common"
"github.com/pkg/errors"
"github.com/SeerLink/libocr/gethwrappers/offchainaggregator"
ocrtypes "github.com/SeerLink/libocr/offchainreporting/types"
)
var (
_ ocrtypes.ContractTransmitter = &OCRContractTransmitter{}
)
type (
OCRContractTransmitter struct {
contractAddress gethCommon.Address
contractABI abi.ABI
transmitter Transmitter
contractCaller *offchainaggregator.OffchainAggregatorCaller
}
Transmitter interface {
CreateEthTransaction(ctx context.Context, toAddress gethCommon.Address, payload []byte) error
FromAddress() gethCommon.Address
}
)
func NewOCRContractTransmitter(
address gethCommon.Address,
contractCaller *offchainaggregator.OffchainAggregatorCaller,
contractABI abi.ABI,
transmitter Transmitter,
) *OCRContractTransmitter {
return &OCRContractTransmitter{
contractAddress: address,
contractABI: contractABI,
transmitter: transmitter,
contractCaller: contractCaller,
}
}
func (oc *OCRContractTransmitter) Transmit(ctx context.Context, report []byte, rs, ss [][32]byte, vs [32]byte) error {
payload, err := oc.contractABI.Pack("transmit", report, rs, ss, vs)
if err != nil {
return errors.Wrap(err, "abi.Pack failed")
}
return errors.Wrap(oc.transmitter.CreateEthTransaction(ctx, oc.contractAddress, payload), "failed to send Eth transaction")
}
func (oc *OCRContractTransmitter) LatestTransmissionDetails(ctx context.Context) (configDigest ocrtypes.ConfigDigest, epoch uint32, round uint8, latestAnswer ocrtypes.Observation, latestTimestamp time.Time, err error) {
opts := bind.CallOpts{Context: ctx, Pending: false}
result, err := oc.contractCaller.LatestTransmissionDetails(&opts)
if err != nil {
return configDigest, 0, 0, ocrtypes.Observation(nil), time.Time{}, errors.Wrap(err, "error getting LatestTransmissionDetails")
}
return result.ConfigDigest, result.Epoch, result.Round, ocrtypes.Observation(result.LatestAnswer), time.Unix(int64(result.LatestTimestamp), 0), nil
}
func (oc *OCRContractTransmitter) FromAddress() gethCommon.Address {
return oc.transmitter.FromAddress()
}