@@ -17,6 +17,9 @@ package conway
17
17
import (
18
18
"errors"
19
19
"fmt"
20
+ "iter"
21
+ "maps"
22
+ "slices"
20
23
21
24
"github.com/blinklabs-io/gouroboros/cbor"
22
25
"github.com/blinklabs-io/gouroboros/ledger/alonzo"
@@ -154,20 +157,8 @@ func (h *ConwayBlockHeader) Era() common.Era {
154
157
return EraConway
155
158
}
156
159
157
- type ConwayRedeemerKey struct {
158
- cbor.StructAsArray
159
- Tag common.RedeemerTag
160
- Index uint32
161
- }
162
-
163
- type ConwayRedeemerValue struct {
164
- cbor.StructAsArray
165
- Data cbor.LazyValue
166
- ExUnits common.ExUnits
167
- }
168
-
169
160
type ConwayRedeemers struct {
170
- Redeemers map [ConwayRedeemerKey ] ConwayRedeemerValue
161
+ Redeemers map [common. RedeemerKey ]common. RedeemerValue
171
162
legacyRedeemers alonzo.AlonzoRedeemers
172
163
legacy bool
173
164
}
@@ -190,6 +181,32 @@ func (r *ConwayRedeemers) MarshalCBOR() ([]byte, error) {
190
181
return cbor .Encode (r .Redeemers )
191
182
}
192
183
184
+ func (r ConwayRedeemers ) Iter () iter.Seq2 [common.RedeemerKey , common.RedeemerValue ] {
185
+ return func (yield func (common.RedeemerKey , common.RedeemerValue ) bool ) {
186
+ // Sort redeemers
187
+ sorted := slices .Collect (maps .Keys (r .Redeemers ))
188
+ slices .SortFunc (
189
+ sorted ,
190
+ func (a , b common.RedeemerKey ) int {
191
+ if a .Tag < b .Tag || (a .Tag == b .Tag && a .Index < b .Index ) {
192
+ return - 1
193
+ }
194
+ if a .Tag > b .Tag || (a .Tag == b .Tag && a .Index > b .Index ) {
195
+ return 1
196
+ }
197
+ return 0
198
+ },
199
+ )
200
+ // Yield keys
201
+ for _ , redeemerKey := range sorted {
202
+ tmpVal := r .Redeemers [redeemerKey ]
203
+ if ! yield (redeemerKey , tmpVal ) {
204
+ return
205
+ }
206
+ }
207
+ }
208
+ }
209
+
193
210
func (r ConwayRedeemers ) Indexes (tag common.RedeemerTag ) []uint {
194
211
if r .legacy {
195
212
return r .legacyRedeemers .Indexes (tag )
@@ -206,18 +223,18 @@ func (r ConwayRedeemers) Indexes(tag common.RedeemerTag) []uint {
206
223
func (r ConwayRedeemers ) Value (
207
224
index uint ,
208
225
tag common.RedeemerTag ,
209
- ) (cbor. LazyValue , common.ExUnits ) {
226
+ ) common.RedeemerValue {
210
227
if r .legacy {
211
228
return r .legacyRedeemers .Value (index , tag )
212
229
}
213
- redeemer , ok := r .Redeemers [ConwayRedeemerKey {
230
+ redeemerVal , ok := r .Redeemers [common. RedeemerKey {
214
231
Tag : tag ,
215
232
Index : uint32 (index ), // #nosec G115
216
233
}]
217
234
if ok {
218
- return redeemer . Data , redeemer . ExUnits
235
+ return redeemerVal
219
236
}
220
- return cbor. LazyValue {}, common.ExUnits {}
237
+ return common.RedeemerValue {}
221
238
}
222
239
223
240
type ConwayTransactionWitnessSet struct {
0 commit comments