15
15
package common
16
16
17
17
import (
18
- "fmt"
19
18
"math/big"
20
19
21
20
"github.com/blinklabs-io/gouroboros/cbor"
@@ -129,21 +128,19 @@ func (id *GovActionId) ToPlutusData() data.PlutusData {
129
128
)
130
129
}
131
130
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
138
138
}
139
139
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
+ // nolint:unused
143
+ func (ProposalProcedureBase ) isProposalProcedure () {}
147
144
148
145
const (
149
146
GovActionTypeParameterChange = 0
@@ -155,76 +152,15 @@ const (
155
152
GovActionTypeInfo = 6
156
153
)
157
154
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
-
206
155
type GovAction interface {
207
156
isGovAction ()
208
157
ToPlutusData () data.PlutusData
209
158
}
210
159
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
- }
160
+ type GovActionBase struct {}
226
161
227
- func (a ParameterChangeGovAction ) isGovAction () {}
162
+ // nolint:unused
163
+ func (GovActionBase ) isGovAction () {}
228
164
229
165
type HardForkInitiationGovAction struct {
230
166
cbor.StructAsArray
@@ -238,8 +174,12 @@ type HardForkInitiationGovAction struct {
238
174
}
239
175
240
176
func (a * HardForkInitiationGovAction ) ToPlutusData () data.PlutusData {
177
+ actionId := data .NewConstr (1 )
178
+ if a .ActionId != nil {
179
+ actionId = data .NewConstr (0 , a .ActionId .ToPlutusData ())
180
+ }
241
181
return data .NewConstr (1 ,
242
- a . ActionId . ToPlutusData () ,
182
+ actionId ,
243
183
data .NewConstr (
244
184
0 ,
245
185
data .NewInteger (
@@ -265,13 +205,20 @@ func (a *TreasuryWithdrawalGovAction) ToPlutusData() data.PlutusData {
265
205
pairs := make ([][2 ]data.PlutusData , 0 , len (a .Withdrawals ))
266
206
for addr , amount := range a .Withdrawals {
267
207
pairs = append (pairs , [2 ]data.PlutusData {
268
- data . NewConstr ( 0 , addr .ToPlutusData () ),
208
+ addr .ToPlutusData (),
269
209
data .NewInteger (new (big.Int ).SetUint64 (amount )),
270
210
})
271
211
}
212
+ policyHash := data .NewConstr (1 )
213
+ if len (a .PolicyHash ) > 0 {
214
+ policyHash = data .NewConstr (
215
+ 0 ,
216
+ data .NewByteString (a .PolicyHash ),
217
+ )
218
+ }
272
219
return data .NewConstr (2 ,
273
220
data .NewMap (pairs ),
274
- data . NewByteString ( a . PolicyHash ) ,
221
+ policyHash ,
275
222
)
276
223
}
277
224
@@ -284,8 +231,12 @@ type NoConfidenceGovAction struct {
284
231
}
285
232
286
233
func (a * NoConfidenceGovAction ) ToPlutusData () data.PlutusData {
234
+ actionId := data .NewConstr (1 )
235
+ if a .ActionId != nil {
236
+ actionId = data .NewConstr (0 , a .ActionId .ToPlutusData ())
237
+ }
287
238
return data .NewConstr (3 ,
288
- a . ActionId . ToPlutusData () ,
239
+ actionId ,
289
240
)
290
241
}
291
242
@@ -301,6 +252,10 @@ type UpdateCommitteeGovAction struct {
301
252
}
302
253
303
254
func (a * UpdateCommitteeGovAction ) ToPlutusData () data.PlutusData {
255
+ actionId := data .NewConstr (1 )
256
+ if a .ActionId != nil {
257
+ actionId = data .NewConstr (0 , a .ActionId .ToPlutusData ())
258
+ }
304
259
removedItems := make ([]data.PlutusData , 0 , len (a .Credentials ))
305
260
for _ , cred := range a .Credentials {
306
261
removedItems = append (removedItems , cred .ToPlutusData ())
@@ -325,11 +280,14 @@ func (a *UpdateCommitteeGovAction) ToPlutusData() data.PlutusData {
325
280
}
326
281
327
282
return data .NewConstr (4 ,
328
- a . ActionId . ToPlutusData () ,
283
+ actionId ,
329
284
data .NewList (removedItems ... ),
330
285
data .NewMap (addedPairs ),
331
- data .NewInteger (num ),
332
- data .NewInteger (den ),
286
+ data .NewConstr (
287
+ 0 ,
288
+ data .NewInteger (num ),
289
+ data .NewInteger (den ),
290
+ ),
333
291
)
334
292
}
335
293
@@ -347,11 +305,21 @@ type NewConstitutionGovAction struct {
347
305
}
348
306
349
307
func (a * NewConstitutionGovAction ) ToPlutusData () data.PlutusData {
308
+ actionId := data .NewConstr (1 )
309
+ if a .ActionId != nil {
310
+ actionId = data .NewConstr (0 , a .ActionId .ToPlutusData ())
311
+ }
312
+ scriptHash := data .NewConstr (1 )
313
+ if len (a .Constitution .ScriptHash ) > 0 {
314
+ scriptHash = data .NewConstr (
315
+ 0 ,
316
+ data .NewByteString (a .Constitution .ScriptHash ),
317
+ )
318
+ }
350
319
return data .NewConstr (5 ,
351
- a . ActionId . ToPlutusData () ,
320
+ actionId ,
352
321
data .NewConstr (0 ,
353
- a .Constitution .Anchor .ToPlutusData (),
354
- data .NewByteString (a .Constitution .ScriptHash ),
322
+ scriptHash ,
355
323
),
356
324
)
357
325
}
0 commit comments