Skip to content

Commit 1bc1a46

Browse files
committed
go: add support for v9 schema
1 parent 2d0c274 commit 1bc1a46

File tree

4 files changed

+168
-1
lines changed

4 files changed

+168
-1
lines changed

go/report/report.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ import (
99
v3 "github.com/smartcontractkit/data-streams-sdk/go/report/v3"
1010
v4 "github.com/smartcontractkit/data-streams-sdk/go/report/v4"
1111
v8 "github.com/smartcontractkit/data-streams-sdk/go/report/v8"
12+
v9 "github.com/smartcontractkit/data-streams-sdk/go/report/v9"
1213
)
1314

1415
// Data represents the actual report data and attributes
1516
type Data interface {
16-
v1.Data | v2.Data | v3.Data | v4.Data | v8.Data
17+
v1.Data | v2.Data | v3.Data | v4.Data | v8.Data | v9.Data
1718
Schema() abi.Arguments
1819
}
1920

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
v3 "github.com/smartcontractkit/data-streams-sdk/go/report/v3"
1414
v4 "github.com/smartcontractkit/data-streams-sdk/go/report/v4"
1515
v8 "github.com/smartcontractkit/data-streams-sdk/go/report/v8"
16+
v9 "github.com/smartcontractkit/data-streams-sdk/go/report/v9"
1617
)
1718

1819
func TestReport(t *testing.T) {
@@ -85,6 +86,20 @@ func TestReport(t *testing.T) {
8586
if !reflect.DeepEqual(v8Report, rv8) {
8687
t.Errorf("expected: %#v, got: %#v", v8Report, rv8)
8788
}
89+
90+
b, err = schema.Pack(v9Report.ReportContext, v9Report.ReportBlob, v9Report.RawRs, v9Report.RawSs, v9Report.RawVs)
91+
if err != nil {
92+
t.Errorf("failed to encode report: %s", err)
93+
}
94+
95+
rv9, err := Decode[v9.Data](b)
96+
if err != nil {
97+
t.Errorf("failed to decode report: %s", err)
98+
}
99+
100+
if !reflect.DeepEqual(v8Report, rv8) {
101+
t.Errorf("expected: %#v, got: %#v", v9Report, rv9)
102+
}
88103
}
89104

90105
var v1Report = &Report[v1.Data]{
@@ -132,6 +147,15 @@ var v8Report = &Report[v8.Data]{
132147
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},
133148
}
134149

150+
var v9Report = &Report[v9.Data]{
151+
Data: v9Data,
152+
ReportContext: [3][32]uint8{},
153+
ReportBlob: mustPackData(v9Data),
154+
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}},
155+
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}},
156+
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},
157+
}
158+
135159
var v1Data = v1.Data{
136160
FeedID: [32]uint8{00, 01, 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},
137161
ObservationsTimestamp: uint32(time.Now().Unix()),
@@ -189,6 +213,19 @@ var v8Data = v8.Data{
189213
MarketStatus: 1,
190214
}
191215

216+
var v9Data = v9.Data{
217+
FeedID: [32]uint8{00, 9, 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},
218+
ValidFromTimestamp: uint32(time.Now().Unix()),
219+
ObservationsTimestamp: uint32(time.Now().Unix()),
220+
NativeFee: big.NewInt(10),
221+
LinkFee: big.NewInt(10),
222+
ExpiresAt: uint32(time.Now().Unix()) + 100,
223+
NavPerShare: big.NewInt(1100),
224+
NavDate: uint64(time.Now().UnixNano()) - 100,
225+
Aum: big.NewInt(11009),
226+
Ripcord: 108,
227+
}
228+
192229
func mustPackData(d interface{}) []byte {
193230
var args []interface{}
194231
var dataSchema abi.Arguments
@@ -256,6 +293,20 @@ func mustPackData(d interface{}) []byte {
256293
v.MidPrice,
257294
v.MarketStatus,
258295
}
296+
case v9.Data:
297+
dataSchema = v9.Schema()
298+
args = []interface{}{
299+
v.FeedID,
300+
v.ValidFromTimestamp,
301+
v.ObservationsTimestamp,
302+
v.NativeFee,
303+
v.LinkFee,
304+
v.ExpiresAt,
305+
v.NavPerShare,
306+
v.NavDate,
307+
v.Aum,
308+
v.Ripcord,
309+
}
259310
default:
260311
panic(fmt.Sprintf("invalid type to pack: %#v", v))
261312
}

go/report/v9/data.go

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

go/report/v9/data_test.go

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

0 commit comments

Comments
 (0)