Skip to content

Commit ce14827

Browse files
authored
feat: support for Conway redeemers and PlutusV3 TX witnesses (#672)
Fixes #671
1 parent d0eef33 commit ce14827

File tree

2 files changed

+68
-3
lines changed

2 files changed

+68
-3
lines changed

ledger/alonzo.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,25 @@ func (o AlonzoTransactionOutput) Utxorpc() *utxorpc.TxOutput {
253253
}
254254
}
255255

256+
type AlonzoRedeemer struct {
257+
cbor.StructAsArray
258+
Tag uint8
259+
Index uint32
260+
Data cbor.RawMessage
261+
ExUnits RedeemerExUnits
262+
}
263+
264+
type RedeemerExUnits struct {
265+
cbor.StructAsArray
266+
Memory uint64
267+
Steps uint64
268+
}
269+
256270
type AlonzoTransactionWitnessSet struct {
257271
ShelleyTransactionWitnessSet
258272
PlutusScripts []cbor.RawMessage `cbor:"3,keyasint,omitempty"`
259273
PlutusData []cbor.RawMessage `cbor:"4,keyasint,omitempty"`
260-
Redeemers []cbor.RawMessage `cbor:"5,keyasint,omitempty"`
274+
Redeemers []AlonzoRedeemer `cbor:"5,keyasint,omitempty"`
261275
}
262276

263277
func (t *AlonzoTransactionWitnessSet) UnmarshalCBOR(cborData []byte) error {

ledger/conway.go

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ type ConwayBlock struct {
3838
cbor.DecodeStoreCbor
3939
Header *ConwayBlockHeader
4040
TransactionBodies []ConwayTransactionBody
41-
TransactionWitnessSets []BabbageTransactionWitnessSet
41+
TransactionWitnessSets []ConwayTransactionWitnessSet
4242
TransactionMetadataSet map[uint]*cbor.LazyValue
4343
InvalidTransactions []uint
4444
}
@@ -119,6 +119,57 @@ func (h *ConwayBlockHeader) Era() Era {
119119
return eras[EraIdConway]
120120
}
121121

122+
type ConwayRedeemerKey struct {
123+
cbor.StructAsArray
124+
Tag uint8
125+
Index uint32
126+
}
127+
128+
type ConwayRedeemerValue struct {
129+
cbor.StructAsArray
130+
Data cbor.RawMessage
131+
ExUnits RedeemerExUnits
132+
}
133+
134+
type ConwayRedeemers struct {
135+
Redeemers map[ConwayRedeemerKey]ConwayRedeemerValue
136+
legacy bool
137+
}
138+
139+
func (r *ConwayRedeemers) UnmarshalCBOR(cborData []byte) error {
140+
// Try to parse as legacy redeemer first
141+
var tmpRedeemers []AlonzoRedeemer
142+
if _, err := cbor.Decode(cborData, &tmpRedeemers); err == nil {
143+
// Copy data from legacy redeemer type
144+
for _, redeemer := range tmpRedeemers {
145+
tmpKey := ConwayRedeemerKey{
146+
Tag: redeemer.Tag,
147+
Index: redeemer.Index,
148+
}
149+
tmpVal := ConwayRedeemerValue{
150+
Data: redeemer.Data,
151+
ExUnits: redeemer.ExUnits,
152+
}
153+
r.Redeemers[tmpKey] = tmpVal
154+
}
155+
r.legacy = true
156+
} else {
157+
_, err := cbor.Decode(cborData, &(r.Redeemers))
158+
return err
159+
}
160+
return nil
161+
}
162+
163+
type ConwayTransactionWitnessSet struct {
164+
BabbageTransactionWitnessSet
165+
Redeemers ConwayRedeemers `cbor:"5,keyasint,omitempty"`
166+
PlutusV3Scripts []cbor.RawMessage `cbor:"7,keyasint,omitempty"`
167+
}
168+
169+
func (t *ConwayTransactionWitnessSet) UnmarshalCBOR(cborData []byte) error {
170+
return t.UnmarshalCbor(cborData, t)
171+
}
172+
122173
type ConwayTransactionBody struct {
123174
BabbageTransactionBody
124175
TxVotingProcedures VotingProcedures `cbor:"19,keyasint,omitempty"`
@@ -336,7 +387,7 @@ type ConwayTransaction struct {
336387
cbor.StructAsArray
337388
cbor.DecodeStoreCbor
338389
Body ConwayTransactionBody
339-
WitnessSet BabbageTransactionWitnessSet
390+
WitnessSet ConwayTransactionWitnessSet
340391
IsTxValid bool
341392
TxMetadata *cbor.LazyValue
342393
}

0 commit comments

Comments
 (0)