1
1
package data
2
2
3
3
import (
4
+ "bytes"
4
5
"fmt"
5
6
"math/big"
6
7
"slices"
@@ -15,7 +16,23 @@ func Encode(pd PlutusData) ([]byte, error) {
15
16
return nil , err
16
17
}
17
18
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
19
36
}
20
37
21
38
// encodeToRaw converts PlutusData to a CBOR-encodable representation.
@@ -54,7 +71,7 @@ func encodeConstr(c *Constr) (any, error) {
54
71
if err != nil {
55
72
return nil , fmt .Errorf ("failed to encode Constr field %d: %w" , i , err )
56
73
}
57
- encodedCbor , err := cbor . Marshal (encoded )
74
+ encodedCbor , err := cborMarshal (encoded )
58
75
if err != nil {
59
76
return nil , fmt .Errorf ("failed to encode Constr field item %d: %w" , i , err )
60
77
}
@@ -100,7 +117,7 @@ func encodeMap(m *Map) (any, error) {
100
117
if err != nil {
101
118
return nil , fmt .Errorf ("failed to encode map key: %w" , err )
102
119
}
103
- keyRaw , err := cbor . Marshal (key )
120
+ keyRaw , err := cborMarshal (key )
104
121
if err != nil {
105
122
return nil , fmt .Errorf ("encode map key: %w" , err )
106
123
}
@@ -172,7 +189,7 @@ func encodeList(l *List) (any, error) {
172
189
if err != nil {
173
190
return nil , fmt .Errorf ("failed to encode indef-length list item %d: %w" , i , err )
174
191
}
175
- encodedCbor , err := cbor . Marshal (encoded )
192
+ encodedCbor , err := cborMarshal (encoded )
176
193
if err != nil {
177
194
return nil , fmt .Errorf ("failed to encode indef-length list item %d: %w" , i , err )
178
195
}
0 commit comments