Skip to content

Commit 0a91801

Browse files
committed
Implement V12 support for Go.
1 parent 4111a31 commit 0a91801

File tree

5 files changed

+175
-1
lines changed

5 files changed

+175
-1
lines changed

go/feed/feed.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const (
2222
FeedVersion9
2323
FeedVersion10
2424
FeedVersion11
25+
FeedVersion12
2526
FeedVersion13
2627
_
2728
)

go/report/report.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
v1 "github.com/smartcontractkit/data-streams-sdk/go/report/v1"
99
v10 "github.com/smartcontractkit/data-streams-sdk/go/report/v10"
1010
v11 "github.com/smartcontractkit/data-streams-sdk/go/report/v11"
11+
v12 "github.com/smartcontractkit/data-streams-sdk/go/report/v12"
1112
v13 "github.com/smartcontractkit/data-streams-sdk/go/report/v13"
1213
v2 "github.com/smartcontractkit/data-streams-sdk/go/report/v2"
1314
v3 "github.com/smartcontractkit/data-streams-sdk/go/report/v3"
@@ -21,7 +22,7 @@ import (
2122

2223
// Data represents the actual report data and attributes
2324
type Data interface {
24-
v1.Data | v2.Data | v3.Data | v4.Data | v5.Data | v6.Data | v7.Data | v8.Data | v9.Data | v10.Data | v11.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
2526
Schema() abi.Arguments
2627
}
2728

go/report/report_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
v1 "github.com/smartcontractkit/data-streams-sdk/go/report/v1"
1414
v10 "github.com/smartcontractkit/data-streams-sdk/go/report/v10"
1515
v11 "github.com/smartcontractkit/data-streams-sdk/go/report/v11"
16+
v12 "github.com/smartcontractkit/data-streams-sdk/go/report/v12"
1617
v13 "github.com/smartcontractkit/data-streams-sdk/go/report/v13"
1718
v2 "github.com/smartcontractkit/data-streams-sdk/go/report/v2"
1819
v3 "github.com/smartcontractkit/data-streams-sdk/go/report/v3"
@@ -179,6 +180,20 @@ func TestReport(t *testing.T) {
179180
t.Errorf("expected: %#v, got: %#v", v11Report, rv11)
180181
}
181182

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+
182197
b, err = schema.Pack(v13Report.ReportContext, v13Report.ReportBlob, v13Report.RawRs, v13Report.RawSs, v13Report.RawVs)
183198
if err != nil {
184199
t.Errorf("failed to encode report: %s", err)
@@ -293,6 +308,15 @@ var v11Report = &Report[v11.Data]{
293308
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},
294309
}
295310

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+
296320
var v13Report = &Report[v13.Data]{
297321
Data: v13Data,
298322
ReportContext: [3][32]uint8{},
@@ -441,6 +465,19 @@ var v11Data = v11.Data{
441465
MarketStatus: common.MarketStatusOpen,
442466
}
443467

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+
444481
var v13Data = v13.Data{
445482
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},
446483
ValidFromTimestamp: uint32(time.Now().Unix()),
@@ -610,6 +647,20 @@ func mustPackData(d interface{}) []byte {
610647
v.LastTradedPrice,
611648
v.MarketStatus,
612649
}
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+
}
613664
case v13.Data:
614665
dataSchema = v13.Schema()
615666
args = []interface{}{

go/report/v12/data.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package v12
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: "navPerShare", Type: mustNewType("int192")},
32+
{Name: "nextNavPerShare", Type: mustNewType("int192")},
33+
{Name: "navDate", Type: mustNewType("uint64")},
34+
{Name: "ripcord", Type: mustNewType("uint32")},
35+
}
36+
}
37+
38+
// Data is the container for this schema's attributes
39+
type Data struct {
40+
FeedID feed.ID `abi:"feedId"`
41+
ValidFromTimestamp uint32
42+
ObservationsTimestamp uint32
43+
NativeFee *big.Int
44+
LinkFee *big.Int
45+
ExpiresAt uint32
46+
47+
NavPerShare *big.Int
48+
NextNavPerShare *big.Int
49+
NavDate uint64
50+
Ripcord uint32
51+
}
52+
53+
// Schema returns this data version schema
54+
func (Data) Schema() abi.Arguments {
55+
return Schema()
56+
}
57+
58+
// Decode decodes the serialized data bytes
59+
func Decode(data []byte) (*Data, error) {
60+
values, err := schema.Unpack(data)
61+
if err != nil {
62+
return nil, fmt.Errorf("failed to decode report: %w", err)
63+
}
64+
decoded := new(Data)
65+
if err = schema.Copy(decoded, values); err != nil {
66+
return nil, fmt.Errorf("failed to copy report values to struct: %w", err)
67+
}
68+
return decoded, nil
69+
}

go/report/v12/data_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package v12
2+
3+
import (
4+
"math/big"
5+
"reflect"
6+
"testing"
7+
"time"
8+
)
9+
10+
func TestData(t *testing.T) {
11+
r := &Data{
12+
// 0x000c6b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472
13+
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},
14+
ValidFromTimestamp: uint32(time.Now().Unix()),
15+
ObservationsTimestamp: uint32(time.Now().Unix()),
16+
NativeFee: big.NewInt(10),
17+
LinkFee: big.NewInt(10),
18+
ExpiresAt: uint32(time.Now().Unix()) + 100,
19+
20+
NavPerShare: big.NewInt(1100),
21+
NextNavPerShare: big.NewInt(1101),
22+
NavDate: uint64(time.Now().UnixNano()) - 100,
23+
Ripcord: 108,
24+
}
25+
26+
b, err := schema.Pack(
27+
r.FeedID,
28+
r.ValidFromTimestamp,
29+
r.ObservationsTimestamp,
30+
r.NativeFee,
31+
r.LinkFee,
32+
r.ExpiresAt,
33+
34+
r.NavPerShare,
35+
r.NextNavPerShare,
36+
r.NavDate,
37+
r.Ripcord,
38+
)
39+
40+
if err != nil {
41+
t.Errorf("failed to serialize report: %s", err)
42+
}
43+
44+
d, err := Decode(b)
45+
if err != nil {
46+
t.Errorf("failed to deserialize report: %s", err)
47+
}
48+
49+
if !reflect.DeepEqual(r, d) {
50+
t.Errorf("expected: %#v, got %#v", r, d)
51+
}
52+
}

0 commit comments

Comments
 (0)