Skip to content

Commit 0a6df7b

Browse files
authored
DS-899 Implement V11 and V12 support for Go (#50)
2 parents e25e4ee + 0a91801 commit 0a6df7b

File tree

12 files changed

+396
-21
lines changed

12 files changed

+396
-21
lines changed

go/feed/feed.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ const (
2121
FeedVersion8
2222
FeedVersion9
2323
FeedVersion10
24+
FeedVersion11
25+
FeedVersion12
2426
FeedVersion13
2527
_
2628
)

go/report/common/marketstatus.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package common
2+
3+
const (
4+
MarketStatusUnknown uint32 = iota
5+
MarketStatusClosed
6+
MarketStatusOpen
7+
)

go/report/report.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77

88
v1 "github.com/smartcontractkit/data-streams-sdk/go/report/v1"
99
v10 "github.com/smartcontractkit/data-streams-sdk/go/report/v10"
10+
v11 "github.com/smartcontractkit/data-streams-sdk/go/report/v11"
11+
v12 "github.com/smartcontractkit/data-streams-sdk/go/report/v12"
1012
v13 "github.com/smartcontractkit/data-streams-sdk/go/report/v13"
1113
v2 "github.com/smartcontractkit/data-streams-sdk/go/report/v2"
1214
v3 "github.com/smartcontractkit/data-streams-sdk/go/report/v3"
@@ -20,7 +22,7 @@ import (
2022

2123
// Data represents the actual report data and attributes
2224
type Data interface {
23-
v1.Data | v2.Data | v3.Data | v4.Data | v5.Data | v6.Data | v7.Data | v8.Data | v9.Data | v10.Data | v13.Data
25+
v1.Data | v2.Data | v3.Data | v4.Data | v5.Data | v6.Data | v7.Data | v8.Data | v9.Data | v10.Data | v11.Data | v12.Data | v13.Data
2426
Schema() abi.Arguments
2527
}
2628

go/report/report_test.go

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ import (
99

1010
"github.com/ethereum/go-ethereum/accounts/abi"
1111

12+
"github.com/smartcontractkit/data-streams-sdk/go/report/common"
1213
v1 "github.com/smartcontractkit/data-streams-sdk/go/report/v1"
1314
v10 "github.com/smartcontractkit/data-streams-sdk/go/report/v10"
15+
v11 "github.com/smartcontractkit/data-streams-sdk/go/report/v11"
16+
v12 "github.com/smartcontractkit/data-streams-sdk/go/report/v12"
1417
v13 "github.com/smartcontractkit/data-streams-sdk/go/report/v13"
1518
v2 "github.com/smartcontractkit/data-streams-sdk/go/report/v2"
1619
v3 "github.com/smartcontractkit/data-streams-sdk/go/report/v3"
@@ -163,6 +166,34 @@ func TestReport(t *testing.T) {
163166
t.Errorf("expected: %#v, got: %#v", v10Report, rv10)
164167
}
165168

169+
b, err = schema.Pack(v11Report.ReportContext, v11Report.ReportBlob, v11Report.RawRs, v11Report.RawSs, v11Report.RawVs)
170+
if err != nil {
171+
t.Errorf("failed to encode report: %s", err)
172+
}
173+
174+
rv11, err := Decode[v11.Data](b)
175+
if err != nil {
176+
t.Errorf("failed to decode report: %s", err)
177+
}
178+
179+
if !reflect.DeepEqual(v11Report, rv11) {
180+
t.Errorf("expected: %#v, got: %#v", v11Report, rv11)
181+
}
182+
183+
b, err = schema.Pack(v12Report.ReportContext, v12Report.ReportBlob, v12Report.RawRs, v12Report.RawSs, v12Report.RawVs)
184+
if err != nil {
185+
t.Errorf("failed to encode report: %s", err)
186+
}
187+
188+
rv12, err := Decode[v12.Data](b)
189+
if err != nil {
190+
t.Errorf("failed to decode report: %s", err)
191+
}
192+
193+
if !reflect.DeepEqual(v12Report, rv12) {
194+
t.Errorf("expected: %#v, got: %#v", v12Report, rv12)
195+
}
196+
166197
b, err = schema.Pack(v13Report.ReportContext, v13Report.ReportBlob, v13Report.RawRs, v13Report.RawSs, v13Report.RawVs)
167198
if err != nil {
168199
t.Errorf("failed to encode report: %s", err)
@@ -268,6 +299,24 @@ var v10Report = &Report[v10.Data]{
268299
RawVs: [32]uint8{00, 01, 10, 74, 67, 29, 24, 17, 12, 18, 22, 11, 69, 11, 63, 86, 12, 86, 23, 58, 13, 53, 29, 12, 17, 10, 17, 12, 63, 27, 12, 14},
269300
}
270301

302+
var v11Report = &Report[v11.Data]{
303+
Data: v11Data,
304+
ReportContext: [3][32]uint8{},
305+
ReportBlob: mustPackData(v11Data),
306+
RawRs: [][32]uint8{{00, 01, 10, 74, 67, 29, 24, 17, 12, 18, 22, 11, 69, 11, 63, 86, 12, 86, 23, 58, 13, 53, 29, 12, 17, 10, 17, 12, 63, 27, 12, 14}},
307+
RawSs: [][32]uint8{{01, 02, 10, 73, 65, 19, 14, 27, 42, 48, 52, 18, 39, 116, 67, 85, 13, 82, 33, 48, 23, 33, 49, 32, 67, 50, 37, 32, 63, 77, 14, 64}},
308+
RawVs: [32]uint8{00, 01, 10, 74, 67, 29, 24, 17, 12, 18, 22, 11, 69, 11, 63, 86, 12, 86, 23, 58, 13, 53, 29, 12, 17, 10, 17, 12, 63, 27, 12, 14},
309+
}
310+
311+
var v12Report = &Report[v12.Data]{
312+
Data: v12Data,
313+
ReportContext: [3][32]uint8{},
314+
ReportBlob: mustPackData(v12Data),
315+
RawRs: [][32]uint8{{00, 01, 10, 74, 67, 29, 24, 17, 12, 18, 22, 11, 69, 11, 63, 86, 12, 86, 23, 58, 13, 53, 29, 12, 17, 10, 17, 12, 63, 27, 12, 14}},
316+
RawSs: [][32]uint8{{01, 02, 10, 73, 65, 19, 14, 27, 42, 48, 52, 18, 39, 116, 67, 85, 13, 82, 33, 48, 23, 33, 49, 32, 67, 50, 37, 32, 63, 77, 14, 64}},
317+
RawVs: [32]uint8{00, 01, 10, 74, 67, 29, 24, 17, 12, 18, 22, 11, 69, 11, 63, 86, 12, 86, 23, 58, 13, 53, 29, 12, 17, 10, 17, 12, 63, 27, 12, 14},
318+
}
319+
271320
var v13Report = &Report[v13.Data]{
272321
Data: v13Data,
273322
ReportContext: [3][32]uint8{},
@@ -319,7 +368,7 @@ var v4Data = v4.Data{
319368
LinkFee: big.NewInt(10),
320369
ExpiresAt: uint32(time.Now().Unix()) + 100,
321370
BenchmarkPrice: big.NewInt(100),
322-
MarketStatus: v4.MarketStatusOpen,
371+
MarketStatus: common.MarketStatusOpen,
323372
}
324373

325374
var v5Data = v5.Data{
@@ -399,6 +448,36 @@ var v10Data = v10.Data{
399448
TokenizedPrice: big.NewInt(1001),
400449
}
401450

451+
var v11Data = v11.Data{
452+
FeedID: [32]uint8{00, 11, 251, 109, 19, 88, 151, 228, 170, 245, 101, 123, 255, 211, 176, 180, 143, 142, 42, 81, 49, 33, 76, 158, 194, 214, 46, 172, 93, 83, 32, 103},
453+
ValidFromTimestamp: uint32(time.Now().Unix()),
454+
ObservationsTimestamp: uint32(time.Now().Unix()),
455+
NativeFee: big.NewInt(10),
456+
LinkFee: big.NewInt(10),
457+
ExpiresAt: uint32(time.Now().Unix()) + 100,
458+
Mid: big.NewInt(103),
459+
LastSeenTimestampNs: uint64(time.Now().Unix()),
460+
Bid: big.NewInt(101),
461+
BidVolume: 10002,
462+
Ask: big.NewInt(105),
463+
AskVolume: 10001,
464+
LastTradedPrice: big.NewInt(103),
465+
MarketStatus: common.MarketStatusOpen,
466+
}
467+
468+
var v12Data = v12.Data{
469+
FeedID: [32]uint8{00, 12, 107, 74, 167, 229, 124, 167, 182, 138, 225, 191, 69, 101, 63, 86, 182, 86, 253, 58, 163, 53, 239, 127, 174, 105, 107, 102, 63, 27, 132, 114},
470+
ValidFromTimestamp: uint32(time.Now().Unix()),
471+
ObservationsTimestamp: uint32(time.Now().Unix()),
472+
NativeFee: big.NewInt(10),
473+
LinkFee: big.NewInt(10),
474+
ExpiresAt: uint32(time.Now().Unix()) + 100,
475+
NavPerShare: big.NewInt(1100),
476+
NextNavPerShare: big.NewInt(1101),
477+
NavDate: uint64(time.Now().UnixNano()) - 100,
478+
Ripcord: 108,
479+
}
480+
402481
var v13Data = v13.Data{
403482
FeedID: [32]uint8{00, 13, 19, 169, 185, 197, 227, 122, 9, 159, 55, 78, 146, 195, 121, 20, 175, 92, 38, 143, 58, 138, 151, 33, 241, 114, 81, 53, 191, 180, 203, 184},
404483
ValidFromTimestamp: uint32(time.Now().Unix()),
@@ -550,6 +629,38 @@ func mustPackData(d interface{}) []byte {
550629
v.ActivationDateTime,
551630
v.TokenizedPrice,
552631
}
632+
case v11.Data:
633+
dataSchema = v11.Schema()
634+
args = []interface{}{
635+
v.FeedID,
636+
v.ValidFromTimestamp,
637+
v.ObservationsTimestamp,
638+
v.NativeFee,
639+
v.LinkFee,
640+
v.ExpiresAt,
641+
v.Mid,
642+
v.LastSeenTimestampNs,
643+
v.Bid,
644+
v.BidVolume,
645+
v.Ask,
646+
v.AskVolume,
647+
v.LastTradedPrice,
648+
v.MarketStatus,
649+
}
650+
case v12.Data:
651+
dataSchema = v12.Schema()
652+
args = []interface{}{
653+
v.FeedID,
654+
v.ValidFromTimestamp,
655+
v.ObservationsTimestamp,
656+
v.NativeFee,
657+
v.LinkFee,
658+
v.ExpiresAt,
659+
v.NavPerShare,
660+
v.NextNavPerShare,
661+
v.NavDate,
662+
v.Ripcord,
663+
}
553664
case v13.Data:
554665
dataSchema = v13.Schema()
555666
args = []interface{}{

go/report/v11/data.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package v11
2+
3+
import (
4+
"fmt"
5+
"math/big"
6+
7+
"github.com/ethereum/go-ethereum/accounts/abi"
8+
9+
"github.com/smartcontractkit/data-streams-sdk/go/feed"
10+
)
11+
12+
var schema = Schema()
13+
14+
// Schema returns this data version schema
15+
func Schema() abi.Arguments {
16+
mustNewType := func(t string) abi.Type {
17+
result, err := abi.NewType(t, "", []abi.ArgumentMarshaling{})
18+
if err != nil {
19+
panic(fmt.Sprintf("Unexpected error during abi.NewType: %s", err))
20+
}
21+
return result
22+
}
23+
return []abi.Argument{
24+
{Name: "feedId", Type: mustNewType("bytes32")},
25+
{Name: "validFromTimestamp", Type: mustNewType("uint32")},
26+
{Name: "observationsTimestamp", Type: mustNewType("uint32")},
27+
{Name: "nativeFee", Type: mustNewType("uint192")},
28+
{Name: "linkFee", Type: mustNewType("uint192")},
29+
{Name: "expiresAt", Type: mustNewType("uint32")},
30+
31+
{Name: "mid", Type: mustNewType("int192")},
32+
{Name: "lastSeenTimestampNs", Type: mustNewType("uint64")},
33+
{Name: "bid", Type: mustNewType("int192")},
34+
{Name: "bidVolume", Type: mustNewType("uint64")},
35+
{Name: "ask", Type: mustNewType("int192")},
36+
{Name: "askVolume", Type: mustNewType("uint64")},
37+
{Name: "lastTradedPrice", Type: mustNewType("int192")},
38+
{Name: "marketStatus", Type: mustNewType("uint32")},
39+
}
40+
}
41+
42+
// Data is the container for this schema's attributes
43+
type Data struct {
44+
FeedID feed.ID `abi:"feedId"`
45+
ValidFromTimestamp uint32
46+
ObservationsTimestamp uint32
47+
NativeFee *big.Int
48+
LinkFee *big.Int
49+
ExpiresAt uint32
50+
51+
Mid *big.Int
52+
LastSeenTimestampNs uint64
53+
Bid *big.Int
54+
BidVolume uint64
55+
Ask *big.Int
56+
AskVolume uint64
57+
LastTradedPrice *big.Int
58+
MarketStatus uint32
59+
}
60+
61+
// Schema returns this data version schema
62+
func (Data) Schema() abi.Arguments {
63+
return Schema()
64+
}
65+
66+
// Decode decodes the serialized data bytes
67+
func Decode(data []byte) (*Data, error) {
68+
values, err := schema.Unpack(data)
69+
if err != nil {
70+
return nil, fmt.Errorf("failed to decode report: %w", err)
71+
}
72+
decoded := new(Data)
73+
if err = schema.Copy(decoded, values); err != nil {
74+
return nil, fmt.Errorf("failed to copy report values to struct: %w", err)
75+
}
76+
return decoded, nil
77+
}

go/report/v11/data_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package v11
2+
3+
import (
4+
"math/big"
5+
"reflect"
6+
"testing"
7+
"time"
8+
9+
"github.com/smartcontractkit/data-streams-sdk/go/report/common"
10+
)
11+
12+
func TestData(t *testing.T) {
13+
r := &Data{
14+
// 0x000bfb6d135897e4aaf5657bffd3b0b48f8e2a5131214c9ec2d62eac5d532067
15+
FeedID: [32]uint8{0, 11, 251, 109, 19, 88, 151, 228, 170, 245, 101, 123, 255, 211, 176, 180, 143, 142, 42, 81, 49, 33, 76, 158, 194, 214, 46, 172, 93, 83, 32, 103},
16+
ValidFromTimestamp: uint32(time.Now().Unix()),
17+
ObservationsTimestamp: uint32(time.Now().Unix()),
18+
NativeFee: big.NewInt(10),
19+
LinkFee: big.NewInt(10),
20+
ExpiresAt: uint32(time.Now().Unix()) + 100,
21+
22+
Mid: big.NewInt(103),
23+
LastSeenTimestampNs: uint64(time.Now().Unix()),
24+
Bid: big.NewInt(101),
25+
BidVolume: 10002,
26+
Ask: big.NewInt(105),
27+
AskVolume: 10001,
28+
LastTradedPrice: big.NewInt(103),
29+
MarketStatus: common.MarketStatusOpen,
30+
}
31+
32+
b, err := schema.Pack(
33+
r.FeedID,
34+
r.ValidFromTimestamp,
35+
r.ObservationsTimestamp,
36+
r.NativeFee,
37+
r.LinkFee,
38+
r.ExpiresAt,
39+
r.Mid,
40+
r.LastSeenTimestampNs,
41+
r.Bid,
42+
r.BidVolume,
43+
r.Ask,
44+
r.AskVolume,
45+
r.LastTradedPrice,
46+
r.MarketStatus,
47+
)
48+
49+
if err != nil {
50+
t.Errorf("failed to serialize report: %s", err)
51+
}
52+
53+
d, err := Decode(b)
54+
if err != nil {
55+
t.Errorf("failed to deserialize report: %s", err)
56+
}
57+
58+
if !reflect.DeepEqual(r, d) {
59+
t.Errorf("expected: %#v, got %#v", r, d)
60+
}
61+
}

0 commit comments

Comments
 (0)