1515package common
1616
1717import (
18- "fmt"
1918 "math/big"
2019
2120 "github.com/blinklabs-io/gouroboros/cbor"
@@ -129,21 +128,18 @@ func (id *GovActionId) ToPlutusData() data.PlutusData {
129128 )
130129}
131130
132- type ProposalProcedure struct {
133- cbor.StructAsArray
134- Deposit uint64
135- RewardAccount Address
136- GovAction GovActionWrapper
137- Anchor GovAnchor
131+ type ProposalProcedure interface {
132+ isProposalProcedure ()
133+ ToPlutusData () data.PlutusData
134+ Deposit () uint64
135+ RewardAccount () Address
136+ GovAction () GovAction
137+ Anchor () GovAnchor
138138}
139139
140- func (p * ProposalProcedure ) ToPlutusData () data.PlutusData {
141- return data .NewConstr (0 ,
142- data .NewInteger (new (big.Int ).SetUint64 (p .Deposit )),
143- p .RewardAccount .ToPlutusData (),
144- p .GovAction .ToPlutusData (),
145- )
146- }
140+ type ProposalProcedureBase struct {}
141+
142+ func (ProposalProcedureBase ) isProposalProcedure () {}
147143
148144const (
149145 GovActionTypeParameterChange = 0
@@ -155,76 +151,14 @@ const (
155151 GovActionTypeInfo = 6
156152)
157153
158- type GovActionWrapper struct {
159- Type uint
160- Action GovAction
161- }
162-
163- func (g * GovActionWrapper ) ToPlutusData () data.PlutusData {
164- return g .Action .ToPlutusData ()
165- }
166-
167- func (g * GovActionWrapper ) UnmarshalCBOR (data []byte ) error {
168- // Determine action type
169- actionType , err := cbor .DecodeIdFromList (data )
170- if err != nil {
171- return err
172- }
173- var tmpAction GovAction
174- switch actionType {
175- case GovActionTypeParameterChange :
176- tmpAction = & ParameterChangeGovAction {}
177- case GovActionTypeHardForkInitiation :
178- tmpAction = & HardForkInitiationGovAction {}
179- case GovActionTypeTreasuryWithdrawal :
180- tmpAction = & TreasuryWithdrawalGovAction {}
181- case GovActionTypeNoConfidence :
182- tmpAction = & NoConfidenceGovAction {}
183- case GovActionTypeUpdateCommittee :
184- tmpAction = & UpdateCommitteeGovAction {}
185- case GovActionTypeNewConstitution :
186- tmpAction = & NewConstitutionGovAction {}
187- case GovActionTypeInfo :
188- tmpAction = & InfoGovAction {}
189- default :
190- return fmt .Errorf ("unknown governance action type: %d" , actionType )
191- }
192- // Decode action
193- if _ , err := cbor .Decode (data , tmpAction ); err != nil {
194- return err
195- }
196- // action type is known within uint range
197- g .Type = uint (actionType ) // #nosec G115
198- g .Action = tmpAction
199- return nil
200- }
201-
202- func (g * GovActionWrapper ) MarshalCBOR () ([]byte , error ) {
203- return cbor .Encode (g .Action )
204- }
205-
206154type GovAction interface {
207155 isGovAction ()
208156 ToPlutusData () data.PlutusData
209157}
210158
211- type ParameterChangeGovAction struct {
212- cbor.StructAsArray
213- Type uint
214- ActionId * GovActionId
215- ParamUpdate cbor.RawMessage // NOTE: we use raw to defer processing to account for per-era types
216- PolicyHash []byte
217- }
218-
219- func (a * ParameterChangeGovAction ) ToPlutusData () data.PlutusData {
220- return data .NewConstr (0 ,
221- a .ActionId .ToPlutusData (),
222- data .NewByteString (a .ParamUpdate ),
223- data .NewByteString (a .PolicyHash ),
224- )
225- }
159+ type GovActionBase struct {}
226160
227- func (a ParameterChangeGovAction ) isGovAction () {}
161+ func (GovActionBase ) isGovAction () {}
228162
229163type HardForkInitiationGovAction struct {
230164 cbor.StructAsArray
@@ -238,8 +172,12 @@ type HardForkInitiationGovAction struct {
238172}
239173
240174func (a * HardForkInitiationGovAction ) ToPlutusData () data.PlutusData {
175+ actionId := data .NewConstr (1 )
176+ if a .ActionId != nil {
177+ actionId = data .NewConstr (0 , a .ActionId .ToPlutusData ())
178+ }
241179 return data .NewConstr (1 ,
242- a . ActionId . ToPlutusData () ,
180+ actionId ,
243181 data .NewConstr (
244182 0 ,
245183 data .NewInteger (
@@ -265,13 +203,20 @@ func (a *TreasuryWithdrawalGovAction) ToPlutusData() data.PlutusData {
265203 pairs := make ([][2 ]data.PlutusData , 0 , len (a .Withdrawals ))
266204 for addr , amount := range a .Withdrawals {
267205 pairs = append (pairs , [2 ]data.PlutusData {
268- data . NewConstr ( 0 , addr .ToPlutusData () ),
206+ addr .ToPlutusData (),
269207 data .NewInteger (new (big.Int ).SetUint64 (amount )),
270208 })
271209 }
210+ policyHash := data .NewConstr (1 )
211+ if len (a .PolicyHash ) > 0 {
212+ policyHash = data .NewConstr (
213+ 0 ,
214+ data .NewByteString (a .PolicyHash ),
215+ )
216+ }
272217 return data .NewConstr (2 ,
273218 data .NewMap (pairs ),
274- data . NewByteString ( a . PolicyHash ) ,
219+ policyHash ,
275220 )
276221}
277222
@@ -284,8 +229,12 @@ type NoConfidenceGovAction struct {
284229}
285230
286231func (a * NoConfidenceGovAction ) ToPlutusData () data.PlutusData {
232+ actionId := data .NewConstr (1 )
233+ if a .ActionId != nil {
234+ actionId = data .NewConstr (0 , a .ActionId .ToPlutusData ())
235+ }
287236 return data .NewConstr (3 ,
288- a . ActionId . ToPlutusData () ,
237+ actionId ,
289238 )
290239}
291240
@@ -301,6 +250,10 @@ type UpdateCommitteeGovAction struct {
301250}
302251
303252func (a * UpdateCommitteeGovAction ) ToPlutusData () data.PlutusData {
253+ actionId := data .NewConstr (1 )
254+ if a .ActionId != nil {
255+ actionId = data .NewConstr (0 , a .ActionId .ToPlutusData ())
256+ }
304257 removedItems := make ([]data.PlutusData , 0 , len (a .Credentials ))
305258 for _ , cred := range a .Credentials {
306259 removedItems = append (removedItems , cred .ToPlutusData ())
@@ -325,11 +278,14 @@ func (a *UpdateCommitteeGovAction) ToPlutusData() data.PlutusData {
325278 }
326279
327280 return data .NewConstr (4 ,
328- a . ActionId . ToPlutusData () ,
281+ actionId ,
329282 data .NewList (removedItems ... ),
330283 data .NewMap (addedPairs ),
331- data .NewInteger (num ),
332- data .NewInteger (den ),
284+ data .NewConstr (
285+ 0 ,
286+ data .NewInteger (num ),
287+ data .NewInteger (den ),
288+ ),
333289 )
334290}
335291
@@ -347,11 +303,21 @@ type NewConstitutionGovAction struct {
347303}
348304
349305func (a * NewConstitutionGovAction ) ToPlutusData () data.PlutusData {
306+ actionId := data .NewConstr (1 )
307+ if a .ActionId != nil {
308+ actionId = data .NewConstr (0 , a .ActionId .ToPlutusData ())
309+ }
310+ scriptHash := data .NewConstr (1 )
311+ if len (a .Constitution .ScriptHash ) > 0 {
312+ scriptHash = data .NewConstr (
313+ 0 ,
314+ data .NewByteString (a .Constitution .ScriptHash ),
315+ )
316+ }
350317 return data .NewConstr (5 ,
351- a . ActionId . ToPlutusData () ,
318+ actionId ,
352319 data .NewConstr (0 ,
353- a .Constitution .Anchor .ToPlutusData (),
354- data .NewByteString (a .Constitution .ScriptHash ),
320+ scriptHash ,
355321 ),
356322 )
357323}
0 commit comments