Skip to content

Commit 90e6135

Browse files
authored
refactor: set CBOR encoder options (#116)
Fixes #115 Signed-off-by: Aurora Gaffney <[email protected]>
1 parent 932072f commit 90e6135

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

data/encode.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package data
22

33
import (
4+
"bytes"
45
"fmt"
56
"math/big"
67
"slices"
@@ -15,7 +16,23 @@ func Encode(pd PlutusData) ([]byte, error) {
1516
return nil, err
1617
}
1718

18-
return cbor.Marshal(encoded)
19+
return cborMarshal(encoded)
20+
}
21+
22+
// cborMarshal acts like cbor.Marshal but allows us to set our own encoder options
23+
func cborMarshal(data any) ([]byte, error) {
24+
buf := bytes.NewBuffer(nil)
25+
opts := cbor.EncOptions{
26+
// Make sure that maps have ordered keys
27+
Sort: cbor.SortCoreDeterministic,
28+
}
29+
em, err := opts.EncMode()
30+
if err != nil {
31+
return nil, err
32+
}
33+
enc := em.NewEncoder(buf)
34+
err = enc.Encode(data)
35+
return buf.Bytes(), err
1936
}
2037

2138
// encodeToRaw converts PlutusData to a CBOR-encodable representation.
@@ -54,7 +71,7 @@ func encodeConstr(c *Constr) (any, error) {
5471
if err != nil {
5572
return nil, fmt.Errorf("failed to encode Constr field %d: %w", i, err)
5673
}
57-
encodedCbor, err := cbor.Marshal(encoded)
74+
encodedCbor, err := cborMarshal(encoded)
5875
if err != nil {
5976
return nil, fmt.Errorf("failed to encode Constr field item %d: %w", i, err)
6077
}
@@ -100,7 +117,7 @@ func encodeMap(m *Map) (any, error) {
100117
if err != nil {
101118
return nil, fmt.Errorf("failed to encode map key: %w", err)
102119
}
103-
keyRaw, err := cbor.Marshal(key)
120+
keyRaw, err := cborMarshal(key)
104121
if err != nil {
105122
return nil, fmt.Errorf("encode map key: %w", err)
106123
}
@@ -172,7 +189,7 @@ func encodeList(l *List) (any, error) {
172189
if err != nil {
173190
return nil, fmt.Errorf("failed to encode indef-length list item %d: %w", i, err)
174191
}
175-
encodedCbor, err := cbor.Marshal(encoded)
192+
encodedCbor, err := cborMarshal(encoded)
176193
if err != nil {
177194
return nil, fmt.Errorf("failed to encode indef-length list item %d: %w", i, err)
178195
}

0 commit comments

Comments
 (0)